所以我正在努力为软件添加一个功能,我需要从 C# 到 C++ 使用一些数据,然后返回 C# 并返回数据。我们有一个系统可以使这成为可能,但似乎只有我的机器有问题!我们用...
[DllImport("user32.dll", CharSet=CharSet.Auto)]
public static extern IntPtr SendMessage(IntPtr hWnd, int msg, int wParam, ref COPYDATASTRUCT lParam);
在我们发送消息的方法中,有以下...
hWndRecipient = (hWndRecipient == IntPtr.Zero) ? new IntPtr(AbstractLegacyABELApplication.MainWindowHandle) : hWndRecipient;
COPYDATASTRUCT dataToSend = new COPYDATASTRUCT();
dataToSend.lpData = Marshal.StringToHGlobalAnsi(message);
dataToSend.dwData = (int)messageType;
dataToSend.cbData = GlobalSize(dataToSend.lpData);
SendMessage(hWndRecipient, WM_COPYDATA, hWndSender.ToInt32(), ref dataToSend);
Marshal.FreeHGlobal(dataToSend.lpData);
这可以毫无问题地将数据传输到 c++ 层,我可以解析 xml 中的消息,因此很容易在另一边分开。现在,当尝试将其发回时,我正在执行以下操作(C++)...
System::Runtime::InteropServices::Marshal::FreeHGlobal(pCopyDataStruct->lpData);
CString csOutgoing("SOME SORT OF MESSAGE TO SEND BACK HERE");
pCopyDataStruct->lpData = (PVOID)System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(csOutgoing);
pCopyDataStruct->cbData = csOutgoing.GetLength();
出于某种原因,就在我的机器上,第一行崩溃了,Visual Studio 给了我一个损坏的堆错误。如果我注释掉这行代码,而我暂时忽略内存泄漏的风险只是为了尝试一下,当我回到 C# 时,新消息不会回来,它仍然是旧消息。
我已经搁置了这些更改,并将它们交给了另外两个开发人员,他们都能够毫无问题地构建和运行它们。
我已经尝试从源代码控制中获取我们的最新版本,删除调试文件夹,将 DLL 重新复制到那里,清理,构建,对我来说似乎没有任何改变,我仍然遇到同样的问题。
任何人都对我有一些见解,变得非常沮丧,并且搜索结果是空的!
编辑:我的机器似乎有问题。如果我构建有问题的项目并尝试在 Visual Studio 之外运行代码,它会崩溃,但如果我的同事构建相同的架子集,他可以在 Visual Studio 内外运行它。我让他把他的文件版本发送给我,但我的文件仍然与他的文件一起崩溃......
EDIT2:所以经过无数次尝试,故障排除,我们无法找到解决方案。在同事机器上构建相同的架子集,他可以毫无问题地运行它,无论是在调试中,还是在运行 EXE 时。如果他将他的构建发送给我,在我的系统上运行,它就会崩溃。不得不寻找另一种解决方法,因为我们不能将其提供给客户并与其中一个冒这个问题的风险。