Retrouver les DispID pour ActiveX - C++ - Programmation
MarshPosté le 18-05-2005 à 08:59:20
Bonjour à tous, j'ai un petit problème avec des ActiveX.
Y a t'il un moyen de récuperer les DispID (Dispatch ID) en ne connaissant que la CLSID de notre objet? La fonction GetIDsofNames ne me permet pas de le faire, je vous montre un exemple :
En VB (qui va lire les DispID à la compilation) tout se passe tres vite
J'ai un objet App qui possèdent des fonctions membres, ainsi qu'un sous-objet (ou une propriété?) qui contient aussi des fonctions membres. tout s'execute sans probleme.
En VC++ je n'arrive pas a otenir le meme resultat
LPOLESTR Open_name = L"Open";
status = CA_CreateObjectByProgId ("Logiciel.Application", NULL, &handle); status = CA_GetDispatchFromObjHandle (handle, &pointer);
/* Ouverture d'un fichier test */ pointer->lpVtbl->GetIDsOfNames (pointer, &IID_NULL, &Open_name, 1, 0, ID_array); status = CA_MethodInvoke (handle, NULL, ID_array[0], CAVT_EMPTY, NULL, 1,&typestring, "C:\..." );
Tout se passe bien en ce qui concerne les fonctions membre de l'objet (un DispID est renvoyé pour la fonction Open) crée par Logiciel.Application mais pas pour les fonctions de la propriété Test (VB -> App.Test). J'ai essayé toutes les combinaisons possibles comme Open_name2 = L"Test.Open" , "test->Open", "Test::Open" etc mais impossible de recuperer un DispID.
En cherchant sur le net, j'ai vu plusieurs voies comme par exemple le fait qu'il faut creer un sous-objet pointant sur la propriété Test, ou alors ca parle d'interface IID specifique etc. Le problème c'est que je n'ai aucun renseignement concernant les IID (ont-il bien été enregistrés pendant l'installation du programme Logiciel?), je n'ai juste que le nom Logiciel.Application et sa CLSID, je n'ai pas non plus d'interface graphique type ocx, etc. Avoir les dispid de toutes les fonctions me permettait-il d'avoir acces à toutes les fonctions? Faudra-t-il que je créer quand meme un sous-objet? Comemnt faire?
Quelqu'un peut m'aider??? J'en peux plus ..................................
Marsh Posté le 18-05-2005 à 08:59:20
Bonjour à tous, j'ai un petit problème avec des ActiveX.
Y a t'il un moyen de récuperer les DispID (Dispatch ID) en ne connaissant que la CLSID de notre objet? La fonction GetIDsofNames ne me permet pas de le faire, je vous montre un exemple :
En VB (qui va lire les DispID à la compilation) tout se passe tres vite
App = CreateObject("Logiciel.Application" )
App.Open("c:\...." )
TS = App.Test
TS.Open("c:\..." )
J'ai un objet App qui possèdent des fonctions membres, ainsi qu'un sous-objet (ou une propriété?) qui contient aussi des fonctions membres. tout s'execute sans probleme.
En VC++ je n'arrive pas a otenir le meme resultat
LPOLESTR Open_name = L"Open";
status = CA_CreateObjectByProgId ("Logiciel.Application", NULL, &handle);
status = CA_GetDispatchFromObjHandle (handle, &pointer);
/* Ouverture d'un fichier test */
pointer->lpVtbl->GetIDsOfNames (pointer, &IID_NULL, &Open_name, 1, 0, ID_array);
status = CA_MethodInvoke (handle, NULL, ID_array[0], CAVT_EMPTY, NULL, 1,&typestring, "C:\..." );
Tout se passe bien en ce qui concerne les fonctions membre de l'objet (un DispID est renvoyé pour la fonction Open) crée par Logiciel.Application mais pas pour les fonctions de la propriété Test (VB -> App.Test). J'ai essayé toutes les combinaisons possibles comme Open_name2 = L"Test.Open" , "test->Open", "Test::Open" etc mais impossible de recuperer un DispID.
En cherchant sur le net, j'ai vu plusieurs voies comme par exemple le fait qu'il faut creer un sous-objet pointant sur la propriété Test, ou alors ca parle d'interface IID specifique etc. Le problème c'est que je n'ai aucun renseignement concernant les IID (ont-il bien été enregistrés pendant l'installation du programme Logiciel?), je n'ai juste que le nom Logiciel.Application et sa CLSID, je n'ai pas non plus d'interface graphique type ocx, etc. Avoir les dispid de toutes les fonctions me permettait-il d'avoir acces à toutes les fonctions? Faudra-t-il que je créer quand meme un sous-objet? Comemnt faire?
Quelqu'un peut m'aider??? J'en peux plus ..................................