OVH Cloud OVH Cloud

problème de librairie

16 réponses
Avatar
Damien
Bonjour à tous,
Je dois développer une application qui récupère les données des cartes
Vitale. Pour cela je dois utiliser la librairie api_lec.lib. Je l'ai incluse
à mon projet anisi que les headers qui étaient fournis avec. Avec ce code
tout simple :

#include <cstdlib>
#include <iostream>
#include "win32def.h"
#include "api_lec.h"
#include "api_cps.h"
#include "api_err.h"
#include "gal_err.h"
using namespace std;

int main(int argc, char *argv[])
{
unsigned short * pusMode;
unsigned short * pusCodeErreur;

cout<<"hello!\n";
Hn_Init(pusMode,pusCodeErreur);
system("PAUSE");
return EXIT_SUCCESS;
}

voici ce que le compilateur me donne :

ompilateur: Default compiler
Building Makefile: "C:\Documents and
Settings\Administrateur\Bureau\Lecole\Vitale\Makefile.win"
Exécution de make...
make.exe -f "C:\Documents and
Settings\Administrateur\Bureau\Lecole\Vitale\Makefile.win" all
g++.exe -D__DEBUG__ -c main.cpp -o
ain.o -I"lib/gcc/mingw32/3.4.2/include" -I"include/c++/3.4.2/backward" -I"include/c++/3.4.2/mingw32"
-I"include/c++/3.4.2" -I"include" -I"C:/Documents and
Settings/Administrateur/Bureau/Lecole/Vitale/include" -g3

In file included from main.cpp:6:
include/api_lec.h:162: error: `WORD' does not name a type
include/api_lec.h:163: error: `WORD' does not name a type

In file included from main.cpp:7:
include/api_cps.h:19: error: `CPS_StatusService' does not name a type
include/api_cps.h:20: error: `CPS_InfosCarte' does not name a type
include/api_cps.h:21: error: `CPS_InfosPorteur' does not name a type
include/api_cps.h:22: error: `CPS_ListeAppli' does not name a type
include/api_cps.h:23: error: `CPS_InfosFichier' does not name a type
include/api_cps.h:24: error: `CPS_InfosPS2' does not name a type

include/api_cps.h:25: error: `CPS_SituationPS' does not name a type
include/api_cps.h:26: error: `CPS_Num_ST_PS' does not name a type

make.exe: *** [main.o] Error 1

Exécution terminée

J'utilise devcpp. Quelqu'un peut-il m'aider à y voir clair?
Merci.

6 réponses

1 2
Avatar
Aurelien Regat-Barrel
pour le type INT8 j'ai trouvé juste après avoir posté mon message:
* j'ai laissé la définition de win32def.h et j'ai mis en commentaire celle
de basetsd.h


Mauvaise idée, c'est un header système, il ne faut pas y toucher. Toute
l'API Win32 repose sur ce type, et la compilation de votre projet sur
une autre machine aussi. Donc il vaut mieux éditer win32def.h...

pour win32 je peux enlever le define mais ce qui me gène c'est que la
documentation de l'API avit spécifié de l'inclure...


Oui, sauf que <windows.h> s'en charge...

bon, il ne me reste plus qu'à bien utliser loadlibrary maintenant


Avec un chemin codé en dur c'est mal parti ;-)

--
Aurélien Regat-Barrel

Avatar
Damien
J'ai édité win32def.h et j'ai remis le basetsd.h comme avant.
J'ai apporté quelques modifications à mon code :
int main()
{
typedef int( __stdcall *FCTX)(unsigned short *pusMode, unsigned short
*pusCodeErreur);
int Status;
FCTX Fn_Ptr;
HMODULE ModId;

unsigned short *pusMode;
unsigned short *pusCodeErreur;

pusMode=0;
pusCodeErreur=0;
ModId = LoadLibrary((LPCWSTR)"api_lec.dll");
Fn_Ptr = (FCTX)GetProcAddress(ModId, "Hn_Init");
Status = Fn_Ptr(pusMode, pusCodeErreur);
FreeLibrary(ModId);
std::cout<<"hello!";
getchar();
return 0;

}

Le code compile bien :) mais lorsque je lance le programme ca plante :(. Si
vous voyez des erreurs dans le code ci-dessus faites moi signe, sinon cela
veut dire que j'utilise mal les fonctions de la dll et je vais devoir me
débrouiller tout seul (je n'ai pas le droit de divulguer des informations
concernant les fonctions de l'API)

Merci encore.
Avatar
Damien
J'ai une erreur 126 : ERROR_MOD_NOT_FOUND
126 The specified module could not be found

J'en déduis que mon appel à Loadlibrary n'est pas bon. Si quelqu'un peut me
conseiller...
Avatar
Aurelien Regat-Barrel
J'ai une erreur 126 : ERROR_MOD_NOT_FOUND
126 The specified module could not be found

J'en déduis que mon appel à Loadlibrary n'est pas bon. Si quelqu'un peut me
conseiller...


Ben on sort du cadre C++, c'est de la programmation Windows.
Lis la doc de LoadLibrary, c'est expliqué où il cherche la dll (tu peux
la mettre à côté de ton exe pour faire simple).
Pense à tester les codes de retours des fonctions...

Cela dit:

LoadLibrary((LPCWSTR)"api_lec.dll");

ça c'est faux, même si ça marche, c'est pas bon.

"api_lec.dll" c'est une chaine ANSI (const char* = LPCSTR)
L"api_lec.dll" c'est une chaine Unicode (const wchar_t* = LPCWSTR)

LoadLibrary (et toutes les fonctions Win32 qui manipulent des strings)
existe en 2 versions:
LoadLibraryA( LPCSTR )
LoadLibraryW( LPCWSTR )

LoadLibrary est en fait une macro qui "renvoie" vers LoadLibraryA ou
LoadLibraryW en fonction que la macro UNICODE est définie ou non.
En l'absence de cela, mieux vaut ne pas utiliser LPCWSTR.
Si tu vises UNICODE, entoure toutes tes chaines de la macro TEXT:
LoadLibrary( TEXT( "api_lec.dll" ) );
qui sera traduit par défaut en:
LoadLibraryA( "api_lec.dll" );
ou si UNICODE est définie:
LoadLibraryW( L"api_lec.dll" );

Bref, tout ça pour dire de ne pas utiliser les casts à la C.
http://c.developpez.com/faq/cpp/?page=conversions#DIVERS_casts

et de t'adresser ailleurs pour ce qui est relatif à la programmation
Win32 (fr.comp.os.ms-windows.programamtion...). Fait des recherches
aussi, car LoadLibrary, y'a pas mal de doc là dessus...

--
Aurélien Regat-Barrel

Avatar
kanze
Fabien LE LEZ wrote:
On Tue, 29 Nov 2005 11:35:54 +0100, "Damien" :

Je sais que le fichier se trouve à l'emplacement suivant :
C:Program FilesMicrosoft Platform SDKInclude mais je ne
sais pas comment indiquer au compilateur de rechercher dans
ce répertoire.


Généralement, c'est l'option -I :


Généralement, il y a un certain nombre de répertoires que le
compilateur cherche par défaut. Si je ne me trompe pas, ceci
doit en faire partie, si le compilateur est correctement
installé.

Aussi, sous Windows, la forme « idiomatique » de l'option est /I
(bien que je crois que la plupart des compilateurs acceptent les
deux).

le_nom_du_compilateur.exe "-IC:Program FilesMicrosoft Platform
SDKInclude" machin.cpp


Dans cette contexte, on révanche, je m'écarterai de la forme
idiomatique, pour me servir de / comme séparateur dans le
chemin. C'est peut-être parce que je me sers de bash sous
Windows, mais bash, et probablement d'autres interprêteurs de
commande, vont enlever les .

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34


Avatar
Damien
Merci énormément pour ton aide, je vais en chercher dans des forums plus
adéquats en ce qui concerne mes problèmes de chargement de la librairie.
1 2