У меня есть проект библиотеки типов «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’ к типу интерфейса …
Вы можете просто использовать void *
(или же LPVOID
) передать неформатированный указатель на неуправляемый интерфейс COM. Взгляните на это Таблица.
Однако создание указателей в C # для подгонки клиента к библиотеке часто является признаком плохого дизайна API. Вы должны создать объект или оболочку, которая соответствует цели, которую вы пытаетесь достичь, и передать экземпляр этого объекта методу. Это повышает совместимость и облегчает написание клиентов.
Других решений пока нет …