1

以下に示すように、新しいメソッドを追加する必要があるタイプ ライブラリ プロジェクト "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、次の例外がスローされます。

タイプ 'System.__ComObject' の COM オブジェクトをインターフェイス タイプにキャストできません ...

4

1 に答える 1

0

void *(または) を使用するだけLPVOIDで、フォーマットされていないポインターをアンマネージ COM インターフェイスに渡すことができます。このを見てください。

ただし、クライアントをライブラリに適合させるために C# でポインターを作成することは、多くの場合、API 設計が不適切であることを示しています。達成しようとしている目的に合ったオブジェクトまたはラッパーを作成し、そのオブジェクトのインスタンスをメソッドに渡す必要があります。これにより、互換性が向上し、クライアントの作成が容易になります。

于 2013-01-31T10:38:21.413 に答える