【问题标题】:How to pass argument of type IntPtr from c# project to my COM DLL project如何将 IntPtr 类型的参数从 c# 项目传递到我的 COM DLL 项目
【发布时间】:2013-01-06 16:06:22
【问题描述】:

我有一个类型库项目“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 时,会引发以下异常:

无法将“System.__ComObject”类型的 COM 对象转换为接口类型...

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-18
      • 1970-01-01
      • 2011-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-18
      相关资源
      最近更新 更多