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. Если он отправит мне свою сборку, работающую на моей системе, она вылетит. Пришлось найти другую работу вокруг, так как мы не можем дать это клиентам и рискнуть этой проблемой с одним из них.