我有一个类型库项目“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 定义中使用 HANDLE
时,会抛出以下异常:
Unable to cast COM object of type 'System.__ComObject' to interface type ...
最佳答案
您可以简单地使用 void *
(或 LPVOID
)将未格式化的指针传递给非托管 COM 接口(interface)。看看这个table .
然而,在 C# 中创建指针以使客户端适合库通常是糟糕的 API 设计的标志。您应该创建一个符合您要达到的目的的对象或包装器,并将该对象的实例传递给该方法。这增加了兼容性并使编写客户端变得更容易。
关于c++ - 如何将 IntPtr 类型的参数从 C# 项目传递到我的 COM DLL 项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14475289/