C++ 如何将IntPtr类型的参数从c项目传递到我的COM DLL项目

C++ 如何将IntPtr类型的参数从c项目传递到我的COM DLL项目,c++,c#-4.0,com,atl,typelib,C++,C# 4.0,Com,Atl,Typelib,我有一个类型库项目MyLib,我必须在其中添加一个新方法,如下所示。当从我的C客户机应用程序调用时,它应该以IntPtr作为参数 下面是MyLib项目中方法的IDL定义: [id(9), helpstring("method PrintFile"), local] HRESULT PrintFile([in] HANDLE pDevMode); 有人能告诉我IDL文件中的特定参数应该使用什么类型吗 以下是我的C客户机项目代码: PrintDialog PrntDlg = new PrintD

我有一个类型库项目MyLib,我必须在其中添加一个新方法,如下所示。当从我的C客户机应用程序调用时,它应该以IntPtr作为参数

下面是MyLib项目中方法的IDL定义:

[id(9), helpstring("method PrintFile"), local] 
HRESULT PrintFile([in] HANDLE pDevMode);
有人能告诉我IDL文件中的特定参数应该使用什么类型吗

以下是我的C客户机项目代码:

PrintDialog PrntDlg = new PrintDialog();
PrintDocument printDocument = new PrintDocument();

printDocument.DocumentName = "filename";

PrntDlg.Document = printDocument;

PrntDlg.AllowSelection = true;
PrntDlg.AllowSomePages = true;

if (PrntDlg.ShowDialog() == DialogResult.OK)
{                  
    IntPtr PDevMode = PrntDlg.PrinterSettings.GetHdevmode();
    MyLib.PrintFile(PDevMode);
}
在IDL定义中使用句柄时,会引发以下异常:

无法将“System.\u ComObject”类型的COM对象强制转换为接口类型

您可以简单地使用void*或LPVOID将无格式指针传递到非托管COM接口。看看这个

然而,在C中创建指针使客户机适合库通常是API设计不好的标志。您应该创建一个适合您试图实现的目的的对象或包装器,并将该对象的实例传递给该方法。这增加了兼容性并使编写客户机变得更容易