C++ COM ヘッダーと IDL ファイルに次の宣言があります。
//Header file:
#define MAX_LENGTH 320
typedef BYTE PRE_KEY [MAX_LENGTH];
//IDL file:
#define MAX_COUNT 10
HRESULT Save([in] DWORD dwCommand, [in]float fdata[MAX_COUNT], [out] PRE_KEY* phKey);
これは C# クライアント コードです。
//After C# interop compilation, the method's signature in C# becomes:
Save(uint dwCommand, float[] fdata, out byte[] phKey);
//The code to call the C++ COM server:
uint dwCommand = 2;
float[] fdata = new float[dwCommand];
fdata[0] = 1;
fdata[1] = 2;
byte[] phKey = new byte[320];
save(dwCommand, fdata, out phKey);
呼び出しが C# に戻る前に、コードは ntdll.dll でクラッシュしますが、C++ サーバーは既に処理を終了しており、スタックにはありません。
誰でもこの問題を解決する方法を理解できますか? また、相互運用コンパイルを使用して idl ファイルをコンパイルして C# 署名を生成しているため、C++ IDL ファイルで何かを実行して C# 署名を手動で変更することはできません。
これについて面白いのは、C++ から C# にまったく同じ phKey を返す別の同様の呼び出しがあり、完全に機能することです。唯一の違いは、呼び出し phKey が構造内にあり、構造全体が '[out]' パラメータであることです。これが構造内で返されるが、直接パラメータとして返されない理由が本当にわかりません。