我有这个声明在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#签名。
有趣的是,我还有另一个类似的调用,它返回完全相同的phKey从C++到C#,并且它完美地工作。唯一的区别就是在那个调用中,phKey在一个结构体中,并且整个结构体是一个“[out]”参数。真的看不出为什么可以在结构体中返回它,但不能直接作为参数返回。