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

pcayrol Messages postés 18 Date d'inscription jeudi 24 décembre 2009 Statut Membre Dernière intervention 13 mars 2013 - 3 mars 2008 à 13:46
pcayrol Messages postés 18 Date d'inscription jeudi 24 décembre 2009 Statut Membre Dernière intervention 13 mars 2013 - 4 mars 2008 à 07:13
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

Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
3 mars 2008 à 18:01
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
0
pcayrol Messages postés 18 Date d'inscription jeudi 24 décembre 2009 Statut Membre Dernière intervention 13 mars 2013
3 mars 2008 à 19:09
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
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
3 mars 2008 à 21:03
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.
0
pcayrol Messages postés 18 Date d'inscription jeudi 24 décembre 2009 Statut Membre Dernière intervention 13 mars 2013
4 mars 2008 à 07:13
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
0
Rejoignez-nous