#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);
}