에서 반환하기 ++ COM 헤더와 IDL 파일 :클라이언트는 바이트 배열 내가 C에서이 선언을 C++ COM DLL을
//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);
하는 코드가 충돌합니다 :
//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# 클라이언트 코드 ntdll.dll에서 호출이 C#으로 반환되기 전에 C++ 서버가 이미 처리를 마쳤으므로 더 이상 스택에 없습니다.
누구든지이 문제를 해결하는 방법을 알 수 있습니까? 그리고 interop 컴파일을 사용하여 idl 파일을 컴파일하여 C# signaure를 생성하므로 C++ IDL 파일에서 무언가를 수행하고 C# 시그너처를 수동으로 변경할 수 없습니다.
그리고 이것에 대해 재밌는 점은 C++에서 C#으로 정확히 동일한 phKey를 반환하는 유사한 호출이 있고 완벽하게 작동한다는 것입니다. 유일한 차이점은 phKey가 구조체에 있고 전체 구조체가 '[out]'매개 변수라는 것입니다. 구조체 내에서 이것이 왜 반환 될 수 있는지 직접 볼 수는 없지만 직접 매개 변수로 반환 할 수는 없습니다.