gpt4 book ai didi

c++ - Visual Studio MFC 中的 Delphi WideString

转载 作者:行者123 更新时间:2023-11-30 01:44:08 27 4
gpt4 key购买 nike

我试图从用 Delphi 编写的 EXE 中接收信息。 EXE 向我传递了一个指向其数据结构之一的指针:

Type
RecordType = Record
St: WideString;
Next: Pointer;
End;

Var
DataRec: ^RecordType;

所以在 Visual Studio MFC 中我声明了一个数据类型应该是类似的:

struct RecordRec
{
BSTR St;
void *Next;
};

RecordRec *DataRec;

Delphi 帮助说 WideString 与 BSTR 兼容,但是,这不起作用。当我在 Debug模式下查看我的 St 时,它说

"0x0000000000000000 <Bad Ptr>   wchar_t *"

我不知道如何在 Visual Studio MFC 中声明 WideString 的等效项。

如果它是一个 ShortString 我会声明:

struct RecordRec
{
BYTE StLen;
char St[255];
void *Next;
};

但这对 WideString 不起作用,我真的不认为我应该声明一个包含 ~2^30 (1,073,741,824) 个字符的变量。

我错过了什么?我真的希望有人能提供帮助。

最佳答案

Delphi WideString 确实是 BSTR 的包装器,但是,这并不意味着原始 BSTR 指针可以传递为-是从一个过程到另一个过程。当跨越进程边界时,它的数据必须被编码。 COM 通常会自动处理,但手动传递原始 BSTR 指针不会。

因此,如果您不能更改 Delphi 应用程序来为字符数据提供 IPC 安全数据 block (类似于 ShortString 解决方法),那么接收应用程序将不得不编码BSTR 手动数据。它可以使用 ReadProcessMemory()为此:

  • 从 Delphi 应用程序的地址空间中读取 BSTR 的长度(BSTR 的字符数据以 4 字节整数为前缀,在 wchar_t 元素)
  • 在其自己的地址空间内分配指定长度的wchar_t[]数组
  • 从 Delphi 应用程序的地址空间中读取字符数据到它自己的地址空间中的数组中。

例如(为简洁起见省略了错误处理):

RecordRec *DataRec = ...;
std::wstring DataSt;

if (DataRec->St)
{
HANDLE hProcess = OpenProcess(PROCESS_VM_READ, FALSE, TheDelphiAppProcessID);
int len = 0;
SIZE_T numRead = 0;
ReadProcessMemory(hProcess, LPBYTE(DataRec->St)-4, &len, 4, &numRead);
if (len > 0)
{
DataSt.resize(len);
ReadProcessMemory(hProcess, DataRec->St, &DataSt[0], len*2, &numRead);
}
CloseHandle(hProcess);
}

// use DataSt as needed...

关于c++ - Visual Studio MFC 中的 Delphi WideString,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36726556/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com