Récupérer l'adresse en mémoire de la dll chargée

Signaler
Messages postés
18
Date d'inscription
jeudi 24 décembre 2009
Statut
Membre
Dernière intervention
13 mars 2013
-
Messages postés
18
Date d'inscription
jeudi 24 décembre 2009
Statut
Membre
Dernière intervention
13 mars 2013
-
Bonjour,


Je charge une dll (C++) dynamiquement (avec LoadLibrary) dans mon programme C#.


J'arrive à invoquer des méthodes, etc, etc...


J'aimerais à présent récupérer l'adresse (de début) où ma dll est
chargée en mémoire, j'essaie avec des fonctions de psapi comme suit :

<center>

Code csharp :

unsafe public struct MODULEINFO
{
public IntPtr lpBaseOfDll;
public UInt64 SizeOfImage;
public IntPtr EntryPoint;
}

[DllImport("psapi.dll")]
unsafe private static extern Boolean GetModuleInformation(
[In]IntPtr hProcess,
[In]IntPtr hModule,
[Out]MODULEINFO* moduleInfo,
[In]UInt64 tailleModuleInfo
);

[DllImport("Kernel32.dll")]
private static extern IntPtr LoadLibrary(
[In] string lpFileName
);

unsafe public void LoadDll(String nomDLL)
{
if (!_isDllLoaded)
{
_DllHModule = LoadLibrary(CheminDll + nomDLL);
_isDllLoaded = (_DllHModule != IntPtr.Zero);
}

MODULEINFO moduleInfo;

Process currentProcess = Process.GetCurrentProcess();

if (_isDllLoaded)
{
retour = GetModuleInformation(currentProcess.Handle, _DllHModule, &moduleInfo, (UInt64)Marshal.SizeOf(moduleInfo.GetType()));
}
}

</center>


et cela ne marche pas, GetModuleInformation me retourne un false... :?


Ai-je bien fait de redéfinir MODULEINFO (en m'inspirant de psapi.h) ?


Voyez vous un bug ?


Ou alors connaissez vous un moyen entièrement C#/.NET de récupérer cette information ?


Merci.


Pascal

Pascal

4 réponses

Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
34
Salut,

DWORD en C# c'est UInt32 pas UInt64..

Oui il faut redefinir MODULEINFO dans ton code C#.

"out MODULEINFO" pas "[ Out ] MODULEINFO*"..

http://www.csharpfr.com/codes/PINVOKE-DYNAMIQUE_36080.aspx
Messages postés
18
Date d'inscription
jeudi 24 décembre 2009
Statut
Membre
Dernière intervention
13 mars 2013

Le problème venait du fait que j'ai oublié un StructLayout.Sequential dans la redéfinition de ModuleInfo
Now c'ets bon !

Merci !

Pascal
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
34
Absolument pas,  StructLayout.Sequential est la disposition par défaut en C# des champs d'une structure. Le problème vient des points que j'ai indiqué plus haut.
Messages postés
18
Date d'inscription
jeudi 24 décembre 2009
Statut
Membre
Dernière intervention
13 mars 2013

Ok,

Dès que je suis au boulot ce matin, je poste un copier-coller de ce que j'ai réussi à faire marcher pour vérifier...

Merci encore..

Pascal