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

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

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

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

Может ли кто-нибудь сказать мне, какой тип я должен использовать для этого конкретного аргумента в моем файле IDL?

Ниже приведены коды моего клиентского проекта С#:

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, возникает следующее исключение:

Не удалось преобразовать COM-объект типа «System.__ComObject» в тип интерфейса...


person SK_Gupta    schedule 23.01.2013    source источник


Ответы (1)


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

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

person Carsten    schedule 31.01.2013