Erreur avec loadlibrary

cs_f6dqm1 Messages postés 62 Date d'inscription lundi 8 novembre 2004 Statut Membre Dernière intervention 25 mai 2013 - 13 nov. 2006 à 15:13
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 - 17 nov. 2006 à 12:41
Bonjour à tous.
Dans cette tentative de chargement de la librairie cards.dll avec le bout de code suivant (win98 et Delphi7) je récupére le code d'erreur 1157 dans getlasterror.
Il ne s'agit pas d'une erreur de chemin qui est 31.
Quelqu'un sait-il ce que signifie cette erreur ?
Merci d'avance
//
var
   hcards:THandle;
begin
   hcards:=loadlibrary('c:\windows\system\cards.dll\');
   label1.caption:=inttostr(hcards)+' '+inttostr(getlasterror);
   if hcards<>0 then freelibrary(hcards);
end;
//
Gabriel

17 réponses

cs_Loda Messages postés 814 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 30 juillet 2009 3
13 nov. 2006 à 15:19
salut,

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/debug/base/system_error_codes__1000-1299_.asp
ERROR_DLL_NOT_FOUND
1157 One of the library files needed to run this application cannot be found.

mais je peux pas t'aider plus. dsl.

essai peut être d'appeler SetLastError(0) avant le load. juste pour être sur.
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
13 nov. 2006 à 16:54
un ptit zoom :

var
   hcards:THandle;
begin
   hcards:=loadlibrary('c:\windows\system\cards.dll\');

   label1.caption:=inttostr(hcards)+' '+inttostr(getlasterror);
   if hcards<>0 then freelibrary(hcards);
end;





0
cs_Loda Messages postés 814 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 30 juillet 2009 3
13 nov. 2006 à 17:01
mdr, j'avais même pas vu....
0
cs_f6dqm1 Messages postés 62 Date d'inscription lundi 8 novembre 2004 Statut Membre Dernière intervention 25 mai 2013
14 nov. 2006 à 06:01
Re :
Merci pour la signification du code 1157 malheureusement ça ne m'aide pas beaucoup....
Le '\' en fait de chemin était bien présent dans mon code.
L'erreur est la même quelquesoit la librairie que j'essaie de charger dynamiquement..


Je ne dois pas bien avoir compris l'utilisation de cette procedure loadlibrary
Gabriel
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
14 nov. 2006 à 08:34
gfdg

hcards:= loadlibrary('c:\windows\system\
cards.dll
');

il faut pas mettre de \ a la fin...

<hr size ="2" width="100%" />
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
14 nov. 2006 à 08:36
Erreur 1157 : Un des fichiers bibliothèque nécessaire pour exécuter cette application ne peut pas être trouvé.

0
cs_f6dqm1 Messages postés 62 Date d'inscription lundi 8 novembre 2004 Statut Membre Dernière intervention 25 mai 2013
14 nov. 2006 à 09:00
Re:Re:
Si on enlève le dernier '\' en fin de chemin, on récupère un autre code d'erreur (31) qui lui signifie bien que le chemin est erroné.
En fait, d'après ce que j'ai pu lire sur Internet,  on peut écrire de deux façons :
c:\\windows\\system\\cards.dll
ou
c:\windows\system\cards.dll\
mais celà ne m'explique pas cette erreur 1157 :dll manquante pour exécuter loadlibrary. Ce n'est pas cards.dll puisqu'elle est bien dans le répertoire.
Est-ce que loadlibrary a besoin d'une autre librairie qui n'est pas déclarée dans USES ? J'ai essayé shellApi mais ce n'est pas ça !
Il faut que je trouve quelqu'un qui a déjà utilisé ce loadlibrary avec succès pour comprendre !
@+
Gabriel
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
14 nov. 2006 à 22:38
j'utilise LoadLibrary et FreeLibrary sans problemes.

maintenant, le probleme peut venir de windows 98.

aprés, sous XP le chemin est :

c:\windows\system32\cards.dll

attention, parfois sous Windows 98 le chemin peut etre :

C:\WIN98\

le mieux ettant de faire :

function TestLib(const LibName : string) : boolean;
var HLib : cardinal;
begin
  result := false;
  if FileExists(LibName) then begin
     HLib := LoadLibrary(PChar(LibName));
     result := HLib > 32;
     if Result then
        FreeLibrary(HLib);
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var HLib : cardinal;
    WinDir,SysPath32,SysPath : String;
begin
  WinDir    := GetEnvironmentVariable('windir');
  SysPath   := WinDir+'\system\';
  SysPath32 := WinDir+'\system32\';

  if TestLib(SysPath+'cards.dll') then
     MessageDlg('Load ok ('+SysPath+'cards.dll)',mtInformation,[mbOk],0)
  else
     MessageDlg('Load error ('+SysPath+'cards.dll)',mtWarning,[mbOk],0);

  if TestLib(SysPath32+'cards.dll') then
     MessageDlg('Load ok ('+SysPath32+'cards.dll)',mtInformation,[mbOk],0)
  else
     MessageDlg('Load error ('+SysPath32+'cards.dll)',mtWarning,[mbOk],0);
end;

0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
14 nov. 2006 à 22:52
sinon, loadlibrary et freelibrary sont inclues dans la windows API (unité windows donc).
et ne necessite pas d'autre APIs.

aprés, les differences en XP et 98 peuvent faire en sorte que ...
le mieux serait d'abandonner 98 ... et de passer au moins a w2k ou wXp, faut quand meme pas oublier que Windows 98 a deja presque 10 ans et ne possede pas toutes les avancées technologiques presente dans XP.
il te serat quand meme plus aisé de travailler avec un systeme recent (XP pro SP1 par exemple) plutot qu'un vieux systeme obsolete et plus mis a jours, qui traine la pate.
niveau config, un XP pro SP1 bien configuré tourne sur un Pentium 200Mhz avec 64Mo de ram donc si tu as genre un P3 avec 128Mo de ram ça pose aucuns soucis.
 
moi je comprendrais jamais les mecs qui s'obstine a travailler sur des vieux gringrin, c'est une perte de temps considerable.
ça le fait bien de dire ça alors que j'ai garder mon 486dx2 66 sous windows 3.1 avec turbo pascal 7.0 jusqu'en 2002, mais
il faut dire qu'un bon pc, avec un bon systeme c'est tout de meme plus agreable pour travailler, franchement je ne regrette pas d'avoir jetter tout ça.

0
cs_f6dqm1 Messages postés 62 Date d'inscription lundi 8 novembre 2004 Statut Membre Dernière intervention 25 mai 2013
15 nov. 2006 à 09:35
Hello f0xi (ça ressemble à un indicatif de radioamateur !!) et merci pour les réponses.
J'ai essayé le bout de code proposé et je récupère 2 fois "load error" aussi bien avec SysPath qu'avec SysPath32. Pour SysPath32 c'est normal car cards.dll se trouve dans system et pas dans system32.
J'ai essayé en ajoutant un \ derrière cards.dll et c'est pareil.
Je n'ai pas ajouté de GetLastError pour voir le code d'erreur mais je suppose que ça doit être les mêmes que ceux que j'ai récupérés avec mon bout de code (31 sans \ et 1157 avec \).

Je comprends tes commentaires concernant l'utilisation de Win98.
J'utilise effectivement un P3 (667Mhz) et 128 Mo de Ram. Plusieurs copains m'ont dit que XP allait ramer dur avec seulement 128 Mo de Ram. Cest la raison pour laquelle je n'ai pas changé l'OS.
Je pourrais rajouter 128 Mo de DIMM SDRAM mais c'est un produit qui devient rare donc cher !
En plus, les programmes que je compile sous Win98 et que je refile aux copains marche en général sous XP mais l'inverse n'est pas tjrs vrai.

Celà dit, ça ne résoud pas mon problème de loadlibrary et je ne vois pas très bien pourquoi je n'arrive pas à charger dynamiquement une librairie (quelqu'elle soit) avec mon Delphi7 et mon Win98 !
73
Gabriel
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
15 nov. 2006 à 10:36
Salut,

une question bête :
es tu certain que la Dll en question se trouve bien sur ton disque dur ?
as tu fait une recherche de la Dll sur le DD ?
 
@+
Cirec

0
cs_f6dqm1 Messages postés 62 Date d'inscription lundi 8 novembre 2004 Statut Membre Dernière intervention 25 mai 2013
15 nov. 2006 à 15:10
Re:
Pas de doute. la DLL cards.dll est bien dans windows\system
l'Explorer la trouve bien.
Sur Google j'ai fait une recherche "loadlibrary"AND"error 1157".
Il y a plein de trucs qui sortent mais pas un ne me donne la solution  !
On y lit qu'il s'agit d'une DLL manquante mais laquelle ???
 Est-ce cards.dll qui a besoin d'une autre dll pour s'éxécuter ?
Les seules références externes qu'elle utilise sont kernel, gdi et user, références ultraclassiques.
Est-ce loadlibrary qui a besoin d'une dll pour s'éxécuter que je ne connais pas ?
Mystère
Gabriel
0
cs_Loda Messages postés 814 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 30 juillet 2009 3
15 nov. 2006 à 15:14
as-tu fait un essaie avec une dll toute simple? genre, tu fais vite une petite dll qui fait (presque) rien. Tu la mets dans le même dossier que cards.dll et tu test.
0
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
15 nov. 2006 à 22:10
Comme il s'agit visiblement d'une DLL présente dans les chemins systèmes de Windows, tu n'as même pas besoin de préciser son emplacement physique sur le disque.
Extrait de Win32 Programmer's Reference livré avec Delphi :
If a path is not specified and the filename extension is omitted, the default library extension .DLL is appended. However, the filename string can include a trailing point character (.) to indicate that the module name has no extension. When no path is specified, the function searches for the file in the following sequence:



1. The directory from which the application loaded.
 2. The current directory.
 3. Windows 95: The Windows system directory. Use the GetSystemDirectory function to get the path of this directory.



Windows NT: The 32-bit Windows system directory. Use the GetSystemDirectory function to get the path of this directory. The name of this directory is SYSTEM32.



4. Windows NT: The 16-bit Windows system directory. There is no Win32 function that obtains the path of this directory, but it is searched. The name of this directory is SYSTEM.
 5. The Windows directory. Use the GetWindowsDirectory function to get the path of this directory.
 6. The directories that are listed in the PATH environment variable.



May Delphi be with you !


<hr color="#008000" />
Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
0
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
16 nov. 2006 à 00:48
Salut,

Je crois que je peux embrouiller encore plus la situation...
J'utilise XP pro, et Win98 (afin de vérifier la compatibilité de mes codes).
Voici ce que j'ai noté.
'C:\WINDOWS\SYSTEM\CARDS.DLL' (98) : taille 148 528 octets
'D:\WINDOWS\system32\cards.dll' (XP) : taille 359 936 octets
Si je charge l'une ou l'autre de ces dll, avec le chemin "en dur" :
- sous 98, aucun problème,
- sous XP, la dll de XP se charge, l'autre (98) n'est pas reconnue comme étant valide.
Le message d'erreur ne vient pas du compilateur, mais du système, qui me dit que "CARDS.DLL n'est pas une image Windows valide".
Et ce n'est pas une question de path, car cela se reproduit également si je mets les cards.dll dans le même répertoire que l'exécutable qui les appelle.
De fait, comme nous le rappelle Delphiprog, il est en effet normalement inutile de préciser le chemin de la dll se trouvant dans le répertoire système.
Voilà, étonnant, non ?

A+

japee
0
cs_f6dqm1 Messages postés 62 Date d'inscription lundi 8 novembre 2004 Statut Membre Dernière intervention 25 mai 2013
16 nov. 2006 à 09:04
Bonjour à tous


Pour faire avancer le schmilblic, je me suis fait une petite dll et elle se charge sans problème.
J'ai essayé d'autres dll de windows\system et elles se chargent aussi.
Donc le problème vient de cards.dll.
Le message de japee me laisse à penser que le cards.dll d'XP et celui de W98 n'ont rien à voir.
Question : la dll cards.dll de W98 (148K) ne serait-elle pas une dll 16bits que loadlibrary de Delphi7 (32 bits) refuserait de télécharger ?

Gabriel
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
17 nov. 2006 à 12:41
Salut,


Bonne remarque.


function LoadLibrary16(LibFileName: PAnsiChar): THandle; stdcall;
external kernel32 index 35;

function LoadLib16(LibFileName: String): THandle;
begin
Result := LoadLibrary16(PChar(LibFileName));
if Result < HInstance_Error then
raise EFOpenError.Create('LoadLibrary16 failed!');
end;


Depuis ici.
0
Rejoignez-nous