そのため、ソフトウェアに機能を追加する作業を行っており、データを使用して 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# に戻ったときに新しいメッセージが返されず、古いメッセージのままです。
私はこれらの変更を棚上げし、他の 2 人の開発者に渡しましたが、2 人とも問題なくビルドして実行することができました。
ソース管理から最新のものを取得し、デバッグ フォルダーを削除し、そこに DLL を再コピーし、クリーンアップし、ビルドしようとしましたが、何も変わっていないように見えますが、それでも同じ問題が発生します。
誰かが私に何らかの洞察を持っていて、本当にイライラしていて、検索が空になっています!
編集:私のマシンに何か問題があるようです。問題のプロジェクトをビルドして Visual Studio の外でコードを実行しようとすると、クラッシュしますが、同僚が同じシェルフ セットをビルドすると、Visual Studio の内外で実行できます。私は彼に変更のあるファイルのビルドを送ってもらいましたが、私のファイルはまだ彼のファイルでクラッシュしています...
EDIT2 : そのため、無限の試行、トラブルシューティングの後、解決策を見つけることができませんでした. 同僚のマシンで同じシェルフ セットを構築したところ、デバッグと EXE の実行の両方で問題なく実行できました。彼が自分のビルドを送ってきて、私のシステムで実行すると、クラッシュしてしまいます。これを顧客に提供することはできず、そのうちの 1 つでこの問題を危険にさらすことはできないため、別の回避策を見つける必要がありました。