Переинтерпретировать отправленные данные

#c

Вопрос:

Приведенный ниже код является лишь примером.

Function1 является ли a dllexport , как мне правильно преобразовать/прочитать значение data внутри Foo2 ?

Когда я печатаю значение, оно возвращается 000001DFA1C501F3 .

 Function1(PVOID InPassThruBuffer,   ULONG InPassThruSize);

void Foo(std::wstring* data) {


    Function1(amp;data, sizeof(wchar_t))
}


// ==============================================

typedef struct _REMOTE_ENTRY_INFO_
{
    UCHAR*          UserData;
    ULONG           UserDataSize;
}REMOTE_ENTRY_INFO;

void __stdcall Foo2(REMOTE_ENTRY_INFO* inRemoteInfo)
{
    std::wstring wdata;

    if (inRemoteInfo->UserDataSize == sizeof(wchar_t))
        wdata = reinterpret_cast<wchar_t *>(inRemoteInfo->UserData);


}
 

Комментарии:

1. amp;data это std::wstring** — определенно не wchar_t*

2. Были ли данные ( _REMOTE_ENTRY_INFO_ ) отправлены между процессами ? Если да, то как ?

3. в интерфейсе C, особенно называя буфер параметров функции , вы, вероятно, передадите указатель не на указатель на a std::wstring , а на данные, содержащиеся в std::wstring , т. Е. Что-то вроде Function1(data->c_str(), data->size() 1) (или данные Function1(data->c_str(), (data->size() 1) * sizeof((*data)[0])) в зависимости от того, что именно Function1 делает.

Ответ №1:

Попробуйте вместо этого что-нибудь более похожее:

 void Foo(std::wstring* data)
{
    Function1(const_cast<wchar_t*>(data->c_str()), data->size() * sizeof(wchar_t));
    // or, in C  17 and later:
    // Function1(data->data(), data->size() * sizeof(wchar_t));
}

void __stdcall Foo2(REMOTE_ENTRY_INFO* inRemoteInfo)
{
    wchar_t *wdata = reinterpret_cast<wchar_t*>(inRemoteInfo->UserData);
    int wdatalen = inRemoteInfo->UserDataSize / sizeof(wchar_t);
}
 

Или, если Foo2() in вызывается в контексте Function1() перед Foo() выходом, то вместо этого вы можете просто передать сам std::wstring* указатель:

 void Foo(std::wstring* data)
{
    Function1(amp;data, sizeof(data));

    // or, if Function1() does not *copy* the data,
    // merely passes around the provided pointer as-is:
    //
    // Function1(data, sizeof(*data));
}

void __stdcall Foo2(REMOTE_ENTRY_INFO* inRemoteInfo)
{
    std::wstring *wdata = *reinterpret_cast<std::wstring**>(inRemoteInfo->UserData);

    // or:
    // std::wstring *wdata = reinterpret_cast<std::wstring*>(inRemoteInfo->UserData);
}