Pour la question elle-même: il vous suffit de besoin d'ajouter l'adresse en mémoire, vous chargé le binaire à. C'est à dire. Si vous avez chargé le binaire à l'adresse myLoadAddress
ajoutez simplement cela à myOffset
. Cela ne vous permettra pas d'appeler facilement la fonction, cependant. Si vous voulez faire cela, vous devriez le traiter comme un fichier de bibliothèque (et s'il s'agit en fait d'un fichier de bibliothèque vérifier une fonction système pour charger des bibliothèques comme LoadLibrary sur Windows, puis utiliser GetProcAddress pour récupérer un pointeur vers la fonction).
// create a type for your function signature
typedef void (*myFunc)(A *arg1, B arg2, C arg3);
// create a pointer to your function
myFunc myFuncPointer;
// set the address of the function in memory
myFuncPointer = myLoadAddress + myOffset;
// invoke function
myFuncPointer(A, B, C);
Lors du chargement d'une DLL que vous chargez à l'aide LoadLibrary, puis utilisez GetProcAddress et typecast l'adresse retournée à votre pointeur de fonction - à savoir myFuncPointer = (myFunc)GetProcAddress(hmodule, "myFunc");
dans l'exemple. Sur POSIX, cela fonctionne à peu près de la même façon, mais les fonctions sont légèrement différentes: utilisez dlopen
pour charger la bibliothèque dynamique et dlsym
pour récupérer le symbole. Le Programming Library Howto décrit ceci plus en détail, ou voir les pages man pour dlopen et dlsym. Les bases sont les mêmes.
Je ne suis pas un expert, mais je pense que si vous appelez une fonction __cdecl, la pile fuira si votre programme attend __stdcall. La valeur par défaut doit être __stdcall –
__stdcall est utilisé pour les fonctions WINAPI. __cdecl est la norme pour les autres fonctions. Voir http://msdn.microsoft.com/en-us/library/zkwh89ks(VS.80).aspx – Etan
@Etan J'ai un problème similaire, je me demandais comment vous avez obtenu le décalage de toutes les routines ... s'il vous plaît aider! –