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

标签 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 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/

相关文章:

c++ - 动态创建的 Activex 控件的事件处理

c++ - QT Creator——跨平台编译

c++ - 删除原子/防护数据中的数据

visual-studio - 无法从 Visual Studio 2017 DTE 中的 Powershell 控制台访问 FileCodeModel

c++ - COM 自动向上转型?

c# - "this"可以在 C# 虚拟方法中为 null 吗?其余的实例方法会发生什么?

c++ - QBitArray移位

c++ - Eclipse 上的 Arduino

c# - 简单 Entity Framework 导航错误

c# - 在c#中删除 ""之间的逗号