Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/420.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 自由全局损坏堆 我正在努力把一个特性添加到软件中,我需要从C到C,带一些数据,然后用返回的数据返回tC++。我们有一个系统使这成为可能,但似乎只有我的机器有问题!我们使用 [DllImport("user32.dll", CharSet=CharSet.Auto)] public static extern IntPtr SendMessage(IntPtr hWnd, int msg, int wParam, ref COPYDATASTRUCT lParam);_C#_C++_Marshalling_User32 - Fatal编程技术网

C# 自由全局损坏堆 我正在努力把一个特性添加到软件中,我需要从C到C,带一些数据,然后用返回的数据返回tC++。我们有一个系统使这成为可能,但似乎只有我的机器有问题!我们使用 [DllImport("user32.dll", CharSet=CharSet.Auto)] public static extern IntPtr SendMessage(IntPtr hWnd, int msg, int wParam, ref COPYDATASTRUCT lParam);

C# 自由全局损坏堆 我正在努力把一个特性添加到软件中,我需要从C到C,带一些数据,然后用返回的数据返回tC++。我们有一个系统使这成为可能,但似乎只有我的机器有问题!我们使用 [DllImport("user32.dll", CharSet=CharSet.Auto)] public static extern IntPtr SendMessage(IntPtr hWnd, int msg, int wParam, ref COPYDATASTRUCT lParam);,c#,c++,marshalling,user32,C#,C++,Marshalling,User32,在我们发送消息的方法中,有以下内容 hWndRecipient = (hWndRecipient == IntPtr.Zero) ? new IntPtr(AbstractLegacyABELApplication.MainWindowHandle) : hWndRecipient; COPYDATASTRUCT dataToSend = new COPYDATASTRUCT(); dataToSend.lpData = Marshal.Strin

在我们发送消息的方法中,有以下内容

        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++)

出于某种原因,就在我的机器上,第一行崩溃了,VisualStudio给了我一个损坏的堆错误。如果我注释掉这一行代码,并且我暂时忽略内存泄漏的风险只是为了尝试一下,那么当我返回C#时,新消息不会返回,它仍然是旧消息

我已经搁置了这些更改,并将它们交给了另外两个开发人员,他们都能够毫无问题地构建和运行它们

我尝试过从源代码管理获取最新版本,删除调试文件夹,将DLL重新复制到其中,清理、构建,对我来说似乎没有任何改变,我仍然遇到同样的问题

任何人都对我有所了解,真的很沮丧,搜索结果都是空的

编辑:我的机器似乎有问题。如果我构建有问题的项目并尝试在VisualStudio之外运行代码,它将崩溃,但是如果我的同事构建相同的工具架集,他可以在VisualStudio内外运行它。我让他给我发送了他那个些有变化的文件的版本,而我的版本仍然和他的文件一起崩溃


EDIT2:因此,经过无休止的尝试和故障排除,我们无法找到解决方案。在同事的机器上构建相同的工具架集,他可以在调试和运行EXE时毫无问题地运行它。如果他给我发来他的版本,在我的系统上运行,它就会崩溃。我们必须找到另一种解决办法,因为我们不能将此任务交给客户,而让他们中的一个承担此问题的风险。

我建议您只在c#中分配内存一次,在c#中释放内存一次。使用预定义的缓冲区长度。我尝试不在C++中释放它,但是即使在改变C++的值之后,在返回时C值中仍然会看到旧值。你不应该释放接收器中的内存,Windows已经处理好了。不要重复使用消息处理程序中的COPYDATASTRUCT,创建一个新的。
        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();