Как передать аргумент типа IntPtr из проекта c # в мой проект COM DLL

У меня есть проект библиотеки типов «MyLib», где я должен добавить новый метод, как показано ниже. При вызове из моего клиентского приложения C # это должно занять IntPtr в качестве аргумента.

Ниже приведено определение метода IDL внутри проекта «MyLib»:

[id(9), helpstring("method PrintFile"), local]
HRESULT PrintFile([in] HANDLE pDevMode);

Может кто-нибудь сказать мне, какой тип я должен использовать для этого perticular аргумент в моем файле 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);
}

Когда я использую HANDLE внутри определения IDL выдается следующее исключение get:

Невозможно привести объект COM типа ‘System .__ ComObject’ к типу интерфейса …

1

Решение

Вы можете просто использовать void * (или же LPVOID) передать неформатированный указатель на неуправляемый интерфейс COM. Взгляните на это Таблица.

Однако создание указателей в C # для подгонки клиента к библиотеке часто является признаком плохого дизайна API. Вы должны создать объект или оболочку, которая соответствует цели, которую вы пытаетесь достичь, и передать экземпляр этого объекта методу. Это повышает совместимость и облегчает написание клиентов.

0

Другие решения

Других решений пока нет …