1

所以我正在努力为软件添加一个功能,我需要从 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 时。如果他将他的构建发送给我,在我的系统上运行,它就会崩溃。不得不寻找另一种解决方法,因为我们不能将其提供给客户并与其中一个冒这个问题的风险。

4

0 回答 0