如何将类型IntPtr的参数从c#项目传递给我的COM DLL项目

时间:2013-01-23 08:29:28

标签: c++ c#-4.0 com atl typelib

我有一个类型库项目“MyLib”,我必须添加一个新方法,如下所示。从我的C#客户端应用程序调用时,它应该以{{1​​}}为参数。

以下是“MyLib”项目中方法的IDL定义:

IntPtr

任何人都可以告诉我在IDL文件中我应该使用哪种类型的特定参数吗?

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

[id(9), helpstring("method PrintFile"), local] 
HRESULT PrintFile([in] HANDLE pDevMode);

当我在IDL定义中使用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); } 时,抛出以下异常:

  

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

1 个答案:

答案 0 :(得分:0)

您可以简单地使用void *(或LPVOID)将未格式化的指针传递给非托管COM接口。看一下这个table

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