FreeHGlobal腐败堆

时间:2013-10-31 17:57:25

标签: c# c++ marshalling user32

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

0 个答案:

没有答案