2013-01-23 2 views
1

J'ai un projet de bibliothèque de types "MyLib" où je dois ajouter une nouvelle méthode comme indiqué ci-dessous. Lorsqu'il est appelé depuis mon application client C#, il doit prendre l'argument IntPtr comme argument.Comment passer l'argument de type IntPtr du projet C# à mon projet DLL COM

Voici la définition IDL de la méthode au sein du projet « MyLib »:

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

Quelqu'un peut-il s'il vous plaît me dire quel type je devrais utiliser pour cet argument perticular dans mon fichier IDL?

Voici mon C# codes du projet client:

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); 
} 

Lorsque j'utilise HANDLE dans la définition IDL les années get exception suivante jeté:

Impossible de jeter l'objet COM de type « système. __ComObject » type d'interface ...

Répondre

0

Vous pouvez simplement utiliser void * (ou LPVOID) passer un pointeur non formaté à l'interface COM non gérée. Jetez un oeil à ce table. Toutefois, créer des pointeurs en C# pour que le client corresponde à la bibliothèque est souvent un signe de mauvaise conception de l'API. Vous devez créer un objet ou un wrapper qui correspond au but que vous essayez d'atteindre et transmettre une instance de cet objet à la méthode. Cela augmente la compatibilité et facilite l'écriture de clients.

Questions connexes