Поэтому я работаю над добавлением функции в наше программное обеспечение, и мне нужно перейти с 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 и выходить из него. Я заставил его прислать мне свои сборки файлов, в которых есть изменения, а мой все еще падает с его файлами …
EDIT2Итак, после бесконечных попыток, устранения неполадок, мы не смогли найти решение. Собрав тот же набор полок на компьютере коллег, он мог запустить его без проблем, как при отладке, так и при запуске EXE. Если он отправит мне свою сборку, работающую на моей системе, она вылетит. Пришлось найти другую работу вокруг, так как мы не можем дать это клиентам и рискнуть этой проблемой с одним из них.
Задача ещё не решена.
Других решений пока нет …