OVH Cloud OVH Cloud

Ocx et interfacec

4 réponses
Avatar
lionel letoffet
Hello,

Avec Visual studio 2003 j'ai crée un control ActiveX MFC.

J'ai ajouté une interface en écrivant dans l'idl :

// Informations de classe pour GridCtrl

[ uuid(27B274A2-0498-4C78-97FD-21F4D12964E5),
helpstring("Grid Control"), control ]
coclass Grid
{
[default] dispinterface _DGrid;
[default, source] dispinterface _DGridEvents;
interface IGridAcces;
};

[uuid(358F65A9-448D-482c-8E0F-14B34D6A1B37),
helpstring("Interface d'acces")
]
interface IGridAcces : IUnknown
{

};

Mon contrôle dérive de IGridAcces et implémente AddRef, Release et
QueryInterface.

J'ai ajouté à mon projet les fichiers générés par MIDL : Grid_i.c and
Grididl.h

Je peut ajouter et implémenter des méthodes à mon interface.

Mon problème est :

Dan un application J'insère mon contrôle et utilise propriétés et méthodes .

Je peux récupérer l'interface IUnknown, Mais je n'ai aucune référence à
IGridAccess.

Pour la récupérer je dois inclure Grididl généré par MIDL, jes uis sur que
ce n'est pas normal !!

Je veux utiliser mon contrôle ActiveX en C++ et en C#.

Mais en C# j'ai un problème de GUID.

System.IntPtr op;
Guid gd=new Guid("358F65A9-448D-482c-8E0F-14B34D6A1B37");
System.IntPtr PtrIUnknown = Marshal.GetIUnknownForObject(m_Grid);
Marshal.QueryInterface(PtrInknown, ref gd, out op);

Comment avoir un acces plus facile que cette chaine au GUID de mon
interface ??

Deuxièmement mon pointeur d'interface op est toujours égale à 0 , pourquoi ?

J'ai essaye de passer le GUID de IUnknow et là op est égale PtrIUnknow.

Merci de votre aide

4 réponses

Avatar
Simon Mourier [MS]
Normalement, on peut faire directement en C#

IGridAccess ga = (IGridAccess)m_Grid;

ca va générer un QI automatiquement.

Simon.

"lionel letoffet" a écrit dans le message de
news: 41e4d395$0$19735$
Hello,

Avec Visual studio 2003 j'ai crée un control ActiveX MFC.

J'ai ajouté une interface en écrivant dans l'idl :

// Informations de classe pour GridCtrl

[ uuid(27B274A2-0498-4C78-97FD-21F4D12964E5),
helpstring("Grid Control"), control ]
coclass Grid
{
[default] dispinterface _DGrid;
[default, source] dispinterface _DGridEvents;
interface IGridAcces;
};

[uuid(358F65A9-448D-482c-8E0F-14B34D6A1B37),
helpstring("Interface d'acces")
]
interface IGridAcces : IUnknown
{

};

Mon contrôle dérive de IGridAcces et implémente AddRef, Release et
QueryInterface.

J'ai ajouté à mon projet les fichiers générés par MIDL : Grid_i.c and
Grididl.h

Je peut ajouter et implémenter des méthodes à mon interface.

Mon problème est :

Dan un application J'insère mon contrôle et utilise propriétés et méthodes
.

Je peux récupérer l'interface IUnknown, Mais je n'ai aucune référence à
IGridAccess.

Pour la récupérer je dois inclure Grididl généré par MIDL, jes uis sur que
ce n'est pas normal !!

Je veux utiliser mon contrôle ActiveX en C++ et en C#.

Mais en C# j'ai un problème de GUID.

System.IntPtr op;
Guid gd=new Guid("358F65A9-448D-482c-8E0F-14B34D6A1B37");
System.IntPtr PtrIUnknown = Marshal.GetIUnknownForObject(m_Grid);
Marshal.QueryInterface(PtrInknown, ref gd, out op);

Comment avoir un acces plus facile que cette chaine au GUID de mon
interface ??

Deuxièmement mon pointeur d'interface op est toujours égale à 0 , pourquoi
?

J'ai essaye de passer le GUID de IUnknow et là op est égale PtrIUnknow.

Merci de votre aide




Avatar
lionel letoffet
Merci pour la réponse.

J'ai essayé :

GridLib.IGridAcces ga = (GridLib.IGridAcces)m_Grid;

Cela compile sans problème mais à l'execution j'ai une erreur de RunTime
System.InvalidCastException !!!!

Une idée ??

Merci


----- Original Message -----
From: "Simon Mourier [MS]"
Newsgroups: microsoft.public.fr.dotnet.csharp
Sent: Wednesday, January 12, 2005 8:31 PM
Subject: Re: Ocx et interfacec


Normalement, on peut faire directement en C#

IGridAccess ga = (IGridAccess)m_Grid;

ca va générer un QI automatiquement.

Simon.



Avatar
Simon Mourier [MS]
Hem... dans ce cas, ca veut dire que m_Grid n'implémente pas l'interface
IGridAccess telle que définie dans l'assembly d'import générée
automatiquement par visual studio. Il faut donc dabord vérifier que la DLL
est correcte au niveau Guid, etc...

Ensuite, etes vous sûr que l'OCX implémente bien le QueryInterface sur
IGridAccess?

Simon.

"lionel letoffet" a écrit dans le message de
news: 41e77603$0$23339$
Merci pour la réponse.

J'ai essayé :

GridLib.IGridAcces ga = (GridLib.IGridAcces)m_Grid;

Cela compile sans problème mais à l'execution j'ai une erreur de RunTime
System.InvalidCastException !!!!

Une idée ??

Merci


----- Original Message -----
From: "Simon Mourier [MS]"
Newsgroups: microsoft.public.fr.dotnet.csharp
Sent: Wednesday, January 12, 2005 8:31 PM
Subject: Re: Ocx et interfacec


Normalement, on peut faire directement en C#

IGridAccess ga = (IGridAccess)m_Grid;

ca va générer un QI automatiquement.

Simon.







Avatar
lionel letoffet
Bonjour,

Oui l'OCX implemente bien QueryInterface, AddRef et Release.

J'ai implementé également les tables de réponse d'interface comme avec ATL.
(TN038 dans la MSDN)

En C++ MFC j'accède sans problème à l'interface, en faisant #import, mais
pas en C#.

Peut être devrais je vérifier l'assembly mais comment ?

Je suis coincé !

En tous cas merci pour vos réponses

Lionel

----- Original Message -----
From: "Simon Mourier [MS]"
Newsgroups: microsoft.public.fr.dotnet.csharp
Sent: Friday, January 14, 2005 9:46 PM
Subject: Re: Ocx et interfacec


Hem... dans ce cas, ca veut dire que m_Grid n'implémente pas l'interface
IGridAccess telle que définie dans l'assembly d'import générée
automatiquement par visual studio. Il faut donc dabord vérifier que la DLL
est correcte au niveau Guid, etc...

Ensuite, etes vous sûr que l'OCX implémente bien le QueryInterface sur
IGridAccess?

Simon.

"lionel letoffet" a écrit dans le message de
news: 41e77603$0$23339$
> Merci pour la réponse.
>
> J'ai essayé :
>
> GridLib.IGridAcces ga = (GridLib.IGridAcces)m_Grid;
>
> Cela compile sans problème mais à l'execution j'ai une erreur de RunTime
> System.InvalidCastException !!!!
>
> Une idée ??
>
> Merci
>
>
> ----- Original Message -----
> From: "Simon Mourier [MS]"
> Newsgroups: microsoft.public.fr.dotnet.csharp
> Sent: Wednesday, January 12, 2005 8:31 PM
> Subject: Re: Ocx et interfacec
>
>
>> Normalement, on peut faire directement en C#
>>
>> IGridAccess ga = (IGridAccess)m_Grid;
>>
>> ca va générer un QI automatiquement.
>>
>> Simon.
>>
>
>