Delphi WideString in Visual Studio MFC
Delphi WideString in Visual Studio MFC
我试图从用Delphi编写的EXE中接收信息。EXE向我传递一个指向其数据结构之一的指针:
Type
RecordType = Record
St: WideString;
Next: Pointer;
End;
Var
DataRec: ^RecordType;
因此,在VisualStudioMFC中,我声明了一个应该类似的数据类型:
struct RecordRec
{
BSTR St;
void *Next;
};
RecordRec *DataRec;
Delphi帮助说WideString与BSTR兼容,但这不起作用。当我在调试模式下查看St时,它显示
"0x0000000000000000 <Bad Ptr> wchar_t *"
我不知道如何在VisualStudioMFC中声明WideString的等效项。
如果是ShortString,我会声明:
struct RecordRec
{
BYTE StLen;
char St[255];
void *Next;
};
但这对WideString不起作用,我真的不认为我应该声明一个包含~2^30(1073741824)个字符的变量。
我错过了什么?我真的希望有人能帮忙。
Delphi WideString
实际上是BSTR
的包装器,但这并不意味着原始BSTR
指针可以按原样从一个进程传递到另一个进程。它的数据在通过流程边界时必须进行整理。COM通常会自动处理,但手动传递原始BSTR
指针则不会。
因此,如果您无法更改Delphi应用程序以为字符数据提供IPC安全数据块(类似于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...
您没有遗漏任何内容。Delphi的WideString
实际上相当于BSTR
。您在调试器中看到的值是一个空指针。Delphi会将其视为一个空字符串;你可能应该用同样的方式对待它。
所以您有两个不同的过程-Delphi一个(DP)和VS一个(VSP)。每个都有自己的地址空间,DP中的有效指针在VSP中无效。这就是<Bad Ptr>
(异常?)出现的原因。
顺便说一句,我注意到VSP中的地址是64位的。Delphi进程也是64位吗?
您需要通过共享内存进行某种进程间通信(IPC)。
因为您可以控制服务和MFC程序,所以您可以将接收到的数据保存到DLL中的命名内存映射文件中,然后MFC进程将打开它并读取数据。
- Visual Studio MFC C++ "CFormView" "base class"下拉列表中缺少
- 如何使 MFC Visual Studio C++ 程序在双处理器设置中使用两个 CPU
- 如何使用Visual Studio 2015正确调试MFC容器
- 静态链接 MFC 时,未修改的 Visual Studio 2012 MFC 模板中出现链接错误
- 在基于Visual Studio MFC的应用程序中禁用活动处理程序
- Visual Studio无法识别我的网络摄像头激光测距仪代码的MFC库
- 如何使 MFC 应用程序独立于 Visual Studio 10
- 在LNK2038中编译Visual Studio 2010到2012 RC的MFC应用程序
- Delphi WideString in Visual Studio MFC
- 将旧版本的MFC与新版本的Visual Studio一起使用
- 如何在Visual Studio中的MFC中的ListControl中显示所选文件名
- Visual Studio 2008 MFC拖动对话框(不带标题)并检测所有鼠标事件
- 为什么一个C++ MFC "empty"项目占用 142MB 和一个 6MB 的可执行文件?(Visual Studio 2010)
- 如何在 Visual Studio 中禁用基于对话框的 MFC 应用程序的自动关闭
- Visual Studio MFC CListCtrl 复选框 - 空格键
- Visual Studio Community 2015 MFC 空项目无法编译
- 为什么Visual Studio显示多个线程,即使我的MFC应用不是多线程的?
- 如何使用visual studio和MFC C++在窗口上实现预览
- 添加,保存数据从MFC应用程序(Visual Studio 2015)到SQL Server
- Visual Studio MFC in C++:为什么"int"工作而不"double"?