gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 14:10:48 24 4
gpt4 key购买 nike

我有一个类型库项目“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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com