我在 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]”参数。真的不明白为什么这可以在结构中返回,但不能直接作为参数返回。