OVH Cloud OVH Cloud

Appel de fonction d'une dll

9 réponses
Avatar
Olivier
Bonjour,
Je la declaration suivante
Private Declare Function SetCode Lib "SxCode.dll" (ByVal str as String) as
Long

et je voudrai appeller cette fonction sous VC++
typedef long (CALLBACK* SETCODE) (char*);
SETCODE hSeCode=NULL;

je fais
try
{
m_ResLibrary=::LoadLibrary("SxCode.DLL");
hSetCode=(SETCODE) ::GetProcAddress(m_ResLibrary, "SetCode");
char buf[]="Mon code";
long l=hSetCode(buf);
}
catch (...)
{

}
-> J'obtiens un Access Violation et je passe dans le catch

Comment faire ?

Merci

9 réponses

Avatar
Olivier
Je viens de refaire le test avec un typage BSTR
long l=hSetCode(_bstr_t(buf));

mais j'ai toujours First-chance exception in App.exe (SXCODE.DLL):
0xC0000005: Access Violation.

"Paul Bacelar" wrote in message
news:eS%
Un des inconvénient des catchs d'exception c'est que l'on ne connaît pas


la
ligne fautive mais un débuggeur est fort utile. Donc cela serait très
sympathique de spécifier la ligne de lever d'exception et pour le même


prix
le type d'exception.

De plus "ByVal str as String" c'est du VB donc le type du paramètre n'est
pas char* mais BSTR ou (_bstr_t pour les faignant comme moi).

Faute des informations plus précise, utilise:

typedef long (CALLBACK* SETCODE) (BSTR);

Paul Bacelar

"Olivier" a écrit dans le message de
news:bimuo7$ltn$
> Bonjour,
> Je la declaration suivante
> Private Declare Function SetCode Lib "SxCode.dll" (ByVal str as String)


as
> Long
>
> et je voudrai appeller cette fonction sous VC++
> typedef long (CALLBACK* SETCODE) (char*);
> SETCODE hSeCode=NULL;
>
> je fais
> try
> {
> m_ResLibrary=::LoadLibrary("SxCode.DLL");
> hSetCode=(SETCODE) ::GetProcAddress(m_ResLibrary, "SetCode");
> char buf[]="Mon code";
> long l=hSetCode(buf);
> }
> catch (...)
> {
>
> }
> -> J'obtiens un Access Violation et je passe dans le catch
>
> Comment faire ?
>
> Merci
>
>




Avatar
Paul Bacelar
Valeur de hSetCode? pas NULL par hasard.
Paul Bacelar
"Olivier" a écrit dans le message de
news:bin1ji$o9a$
Je viens de refaire le test avec un typage BSTR
long l=hSetCode(_bstr_t(buf));

mais j'ai toujours First-chance exception in App.exe (SXCODE.DLL):
0xC0000005: Access Violation.

"Paul Bacelar" wrote in message
news:eS%
> Un des inconvénient des catchs d'exception c'est que l'on ne connaît pas
la
> ligne fautive mais un débuggeur est fort utile. Donc cela serait très
> sympathique de spécifier la ligne de lever d'exception et pour le même
prix
> le type d'exception.
>
> De plus "ByVal str as String" c'est du VB donc le type du paramètre


n'est
> pas char* mais BSTR ou (_bstr_t pour les faignant comme moi).
>
> Faute des informations plus précise, utilise:
>
> typedef long (CALLBACK* SETCODE) (BSTR);
>
> Paul Bacelar
>
> "Olivier" a écrit dans le message de
> news:bimuo7$ltn$
> > Bonjour,
> > Je la declaration suivante
> > Private Declare Function SetCode Lib "SxCode.dll" (ByVal str as


String)
as
> > Long
> >
> > et je voudrai appeller cette fonction sous VC++
> > typedef long (CALLBACK* SETCODE) (char*);
> > SETCODE hSeCode=NULL;
> >
> > je fais
> > try
> > {
> > m_ResLibrary=::LoadLibrary("SxCode.DLL");
> > hSetCode=(SETCODE) ::GetProcAddress(m_ResLibrary, "SetCode");
> > char buf[]="Mon code";
> > long l=hSetCode(buf);
> > }
> > catch (...)
> > {
> >
> > }
> > -> J'obtiens un Access Violation et je passe dans le catch
> >
> > Comment faire ?
> >
> > Merci
> >
> >
>
>




Avatar
François Müller
Bonjour

"Olivier" escribió en el mensaje

| Je viens de refaire le test avec un typage BSTR
| long l=hSetCode(_bstr_t(buf));
|
| mais j'ai toujours First-chance exception in App.exe (SXCODE.DLL):
| 0xC0000005: Access Violation.

Je vois déjà une bizarrerie : tu fais du try catch, c'est fort bien, mais
peut être basiquement commencer à tester si m_reslibrary n'est pas nul avant
d'appeler GetProcAddress, et ensuite tester si hSetCode est non nulle avant
de l'exécuter comme pointeur de fonction me semble plutôt utile. (surment
plus qu'une gestion structurée d'exception ici)

François
Avatar
François Müller
"Olivier" escribió en el mensaje
| Je vous ai mis une simplification de mon code,
| le chargement des pointeurs de fonctions de la dll
| est faite dans une classe avec tous les tests d'existances du
| HMODULE de la dll et de la presence des fonctions.

Ok, ok. As tu par hasard la source de la fonction ? par ce qu'il y a une
cht'ite astuce avec VB, il est capable d'aller chercher des fonctions
"décorées" ou non (c'est à dire déclarée "extern C" ou directement C++)

| Mon probleme est lors de l'appel de la dll , l'adresse semble
| bonne, adresse de la dll en memoire (HMODULE) + RVA
| (dispo via dumpbin), par contre le passage de parametres
| semble mauvais generation d'une violation d'acces

As tu essayé en modifiant l'appel comme cela ? (hSetCode)( buf);

F.
Avatar
Paul Bacelar
L'allocation de la chaine utilise t'elle SysAllocString.
Je pense au runtime VB incompatible avec les libC.
Paul Bacelar
"Olivier" a écrit dans le message de
news:binh0n$78t$
Je vous ai mis une simplification de mon code,
le chargement des pointeurs de fonctions de la dll
est faite dans une classe avec tous les tests d'existances du
HMODULE de la dll et de la presence des fonctions.
Mon probleme est lors de l'appel de la dll , l'adresse semble
bonne, adresse de la dll en memoire (HMODULE) + RVA
(dispo via dumpbin), par contre le passage de parametres
semble mauvais generation d'une violation d'acces


> "Olivier" escribió en el mensaje
>
> | Je viens de refaire le test avec un typage BSTR
> | long l=hSetCode(_bstr_t(buf));
> |
> | mais j'ai toujours First-chance exception in App.exe (SXCODE.DLL):
> | 0xC0000005: Access Violation.
>
> Je vois déjà une bizarrerie : tu fais du try catch, c'est fort bien,


mais
> peut être basiquement commencer à tester si m_reslibrary n'est pas nul
avant
> d'appeler GetProcAddress, et ensuite tester si hSetCode est non nulle
avant
> de l'exécuter comme pointeur de fonction me semble plutôt utile.


(surment
> plus qu'une gestion structurée d'exception ici)
>
> François
>
>




Avatar
François Müller
"Paul Bacelar" escribió en el mensaje
| L'allocation de la chaine utilise t'elle SysAllocString.
| Je pense au runtime VB incompatible avec les libC.

La DLL n'est pas une DLL VB : les DLLs VB ne peuvent pas exporter de
fonctions, seulement des objets ActiveX/COM

François
Avatar
Olivier
> | Je vous ai mis une simplification de mon code,
| le chargement des pointeurs de fonctions de la dll
| est faite dans une classe avec tous les tests d'existances du
| HMODULE de la dll et de la presence des fonctions.

Ok, ok. As tu par hasard la source de la fonction ? par ce qu'il y a une
cht'ite astuce avec VB, il est capable d'aller chercher des fonctions
"décorées" ou non (c'est à dire déclarée "extern C" ou directement C++)


je n'ai pas les sources de la fonction, je ne sais pas sous quel language
elle
a ete developpée
via Depency Walker je sais que ca ete linké avec Linker Ver 2.52

on m'a juste donné un sample en VB avec cette declarartion
Private Declare Function SetCode Lib "SxCode.dll" (ByVal str as String) as
Long


| Mon probleme est lors de l'appel de la dll , l'adresse semble
| bonne, adresse de la dll en memoire (HMODULE) + RVA
| (dispo via dumpbin), par contre le passage de parametres
| semble mauvais generation d'une violation d'acces

As tu essayé en modifiant l'appel comme cela ? (hSetCode)( buf);


Toujours access violation :-(((
Avatar
Olivier
les dependances de la dll sont
ADVAPI32.DLL
GDI32.DLL
KERNEL32.DLL
NTDLL.DLL
OLE32.DLL
OLEAUT32.DLL
rpcrt4.dll
USER32.DLL pas de trace de msvbvm60.dll


"Paul Bacelar" wrote in message
news:
L'allocation de la chaine utilise t'elle SysAllocString.
Je pense au runtime VB incompatible avec les libC.
Paul Bacelar
"Olivier" a écrit dans le message de
news:binh0n$78t$
> Je vous ai mis une simplification de mon code,
> le chargement des pointeurs de fonctions de la dll
> est faite dans une classe avec tous les tests d'existances du
> HMODULE de la dll et de la presence des fonctions.
> Mon probleme est lors de l'appel de la dll , l'adresse semble
> bonne, adresse de la dll en memoire (HMODULE) + RVA
> (dispo via dumpbin), par contre le passage de parametres
> semble mauvais generation d'une violation d'acces
>
>
> > "Olivier" escribió en el mensaje
> >
> > | Je viens de refaire le test avec un typage BSTR
> > | long l=hSetCode(_bstr_t(buf));
> > |
> > | mais j'ai toujours First-chance exception in App.exe (SXCODE.DLL):
> > | 0xC0000005: Access Violation.
> >
> > Je vois déjà une bizarrerie : tu fais du try catch, c'est fort bien,
mais
> > peut être basiquement commencer à tester si m_reslibrary n'est pas nul
> avant
> > d'appeler GetProcAddress, et ensuite tester si hSetCode est non nulle
> avant
> > de l'exécuter comme pointeur de fonction me semble plutôt utile.
(surment
> > plus qu'une gestion structurée d'exception ici)
> >
> > François
> >
> >
>
>




Avatar
Paul Bacelar
et mon SysAllocString.
Paul Bacelar
"Olivier" a écrit dans le message de
news:binlka$aba$
les dependances de la dll sont
ADVAPI32.DLL
GDI32.DLL
KERNEL32.DLL
NTDLL.DLL
OLE32.DLL
OLEAUT32.DLL
rpcrt4.dll
USER32.DLL pas de trace de msvbvm60.dll


"Paul Bacelar" wrote in message
news:
> L'allocation de la chaine utilise t'elle SysAllocString.
> Je pense au runtime VB incompatible avec les libC.
> Paul Bacelar
> "Olivier" a écrit dans le message de
> news:binh0n$78t$
> > Je vous ai mis une simplification de mon code,
> > le chargement des pointeurs de fonctions de la dll
> > est faite dans une classe avec tous les tests d'existances du
> > HMODULE de la dll et de la presence des fonctions.
> > Mon probleme est lors de l'appel de la dll , l'adresse semble
> > bonne, adresse de la dll en memoire (HMODULE) + RVA
> > (dispo via dumpbin), par contre le passage de parametres
> > semble mauvais generation d'une violation d'acces
> >
> >
> > > "Olivier" escribió en el mensaje
> > >
> > > | Je viens de refaire le test avec un typage BSTR
> > > | long l=hSetCode(_bstr_t(buf));
> > > |
> > > | mais j'ai toujours First-chance exception in App.exe (SXCODE.DLL):
> > > | 0xC0000005: Access Violation.
> > >
> > > Je vois déjà une bizarrerie : tu fais du try catch, c'est fort bien,
> mais
> > > peut être basiquement commencer à tester si m_reslibrary n'est pas


nul
> > avant
> > > d'appeler GetProcAddress, et ensuite tester si hSetCode est non


nulle
> > avant
> > > de l'exécuter comme pointeur de fonction me semble plutôt utile.
> (surment
> > > plus qu'une gestion structurée d'exception ici)
> > >
> > > François
> > >
> > >
> >
> >
>
>