我有一个类型库项目“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对象强制转换为接口类型...
答案 0 :(得分:0)
您可以简单地使用void *
(或LPVOID
)将未格式化的指针传递给非托管COM接口。看一下这个table。
然而,在C#中创建指针以使客户端适合库通常是API设计错误的标志。您应该创建一个符合您尝试实现目的的对象或包装器,并将该对象的实例传递给该方法。这增加了兼容性并使编写客户端变得更容易。