Erreur avec loadlibrary

Signaler
Messages postés
62
Date d'inscription
lundi 8 novembre 2004
Statut
Membre
Dernière intervention
25 mai 2013
-
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
-
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

Messages postés
814
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
30 juillet 2009
3
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.
Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
37
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;





Messages postés
814
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
30 juillet 2009
3
mdr, j'avais même pas vu....
Messages postés
62
Date d'inscription
lundi 8 novembre 2004
Statut
Membre
Dernière intervention
25 mai 2013

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
Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
37
gfdg

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

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

<hr size ="2" width="100%" />
Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
37
Erreur 1157 : Un des fichiers bibliothèque nécessaire pour exécuter cette application ne peut pas être trouvé.

Messages postés
62
Date d'inscription
lundi 8 novembre 2004
Statut
Membre
Dernière intervention
25 mai 2013

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
Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
37
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;

Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
37
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.

Messages postés
62
Date d'inscription
lundi 8 novembre 2004
Statut
Membre
Dernière intervention
25 mai 2013

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
Messages postés
3826
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
10 mai 2021
44
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

Messages postés
62
Date d'inscription
lundi 8 novembre 2004
Statut
Membre
Dernière intervention
25 mai 2013

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
Messages postés
814
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
30 juillet 2009
3
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.
Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
31
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.
Messages postés
1725
Date d'inscription
vendredi 27 décembre 2002
Statut
Modérateur
Dernière intervention
11 avril 2021
8
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
Messages postés
62
Date d'inscription
lundi 8 novembre 2004
Statut
Membre
Dernière intervention
25 mai 2013

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
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
14
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.