Bonjour à tous,
j'essaie depuis quelques jours d'appeler une dll VB en C++, à l'aide de visual studio 2008. Il se trouve que je rencontres quelques erreurs... Voici la démarche que j'ai mis en place.
Les tuto sur VS ( versions précédentes) conseillaient de faire une dll activeX.
Pour simuler, j'ai codé la dll suivante :
Code :
- Public Class Class1
- Public Function MyVBFunction(ByVal x As Integer) As Integer
- MsgBox(x)
- End Function
- End Class
|
J'ai rajouté les options visible depuis COM, lié avec une clef SN, et j'ai finalement utilisé l'outil OLE-COM Viewer pour voir le .idl de la dll.
Une fois avec le .idl, je l'ai compilé en l'insérant dans un projet C++ et je me suis retrouvé avec le fichier .h et .c. Jusque la, je me sentais relativement trop fort...
Souci, le client suivant
Code :
- //le fichier .h est inclus ici
- HRESULT hr;
- _Class1 *IVBTestClass = NULL;
- int sh=2;
- // Now we will intilize COM
- hr = CoInitialize(0);
- // Use the SUCCEEDED macro and see if we can get a pointer
- // to the interface
- if(SUCCEEDED(hr))
- {
- hr = CoCreateInstance( CLSID_Class1,
- NULL,
- CLSCTX_INPROC_SERVER,
- IID__Class1,
- (void**) &IVBTestClass);
- if(SUCCEEDED(hr))
- {
- long ReturnValue=42;
- // We can test this HR as well if we wanted to
- IVBTestClass->MyVBFunction(sh);
- // We can test this HR as well if we wanted to
- hr = IVBTestClass->Release();
- }
- else
- {
- // Something went wrong
- cout << "CoCreateInstance Failed." << endl;
- }
- }
- // Uninitialize COM
- getchar();
- CoUninitialize();
|
Au début, le prog me disait que la fonction MyVBFunction n'était pas un membre de la classe Class1. Alors, j'ai regardé le .idl et j'ai vu qu'en effet, la classe ne comportait ni attribut ni méthodes.
Ne sachant pas trop quoi faire, j'ai moi meme rajouté la signature de la méthode au .idl, ce qui a forcément rajouté la signature dans le .h et la plus d'erreur de compilation. A l'éxecution, évidemment, ca marche pas (l'appel de la fonction VB soulève une exception que je ne sais pas identifier).
Sachant que tout ceci présente beaucoup d'étapes, je me suis dit qu'il y avait sans doutes un endroit ou j'ai utilisé une méthode fausse.
Quelqu'un aurait des suggestions ?