FreeHGlobal Corrupt Heap

Поэтому я работаю над добавлением функции в наше программное обеспечение, и мне нужно перейти с C# на C++ с некоторыми данными, а затем вернуть обратно t 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 и выходить из него. Я заставил его прислать мне свои сборки файлов, в которых есть изменения, а мой все еще падает с его файлами...

РЕДАКТИРОВАТЬ 2: Таким образом, после бесконечных попыток, устранения неполадок, мы не смогли найти разрешение. Собрав тот же набор полок на компьютере коллег, он мог запустить его без проблем, как в отладке, так и просто запустив EXE. Если он отправит мне свою сборку, работающую на моей системе, она вылетит. Пришлось найти другую работу вокруг, так как мы не можем дать это клиентам и рискнуть этой проблемой с одним из них.

0 ответов

Другие вопросы по тегам