Qualcuno potrebbe spiegarmi come conoscere la convenzione di chiamata di una DLL senza ottenere ed elaborare i nomi dei metodi? Diciamo che la nostra applicazione sta caricando una DLL di terze parti e per gestirla, esistono dei modi efficaci per conoscere la convenzione di chiamata di una DLL? (__stdcall, __cdecl, __fastcall)Come trovare la convenzione di chiamata di una dll di terze parti?
risposta
Se il simbolo inizia con un _
ma non ha @
, quindi è __cdecl
. Se inizia con _
e ha un @
è __stdcall
. Se inizia con @
e ha un altro @
, è __fastcall
.
Mentre si cerca di capire il motivo per cui mi è stato sempre simboli non risolti quando si collega contro una DLL di terze parti sono incappato in un (quasi) soluzione programmatica.
ho scritto un piccolo programma contro l'API di Windows utilizzando UnDecorateSymbolName
da Dbghelp.h
per decodificare il sistema di mutilazione:
#include "Windows.h"
#include "Dbghelp.h"
#include "tchar.h"
int _tmain(int argc, _TCHAR* argv[])
{
CHAR out[512];
UnDecorateSymbolName(
// Mangled symbol
"[email protected]@[email protected]@[email protected]@XZ",
out,
// Length of symbol
46,
UNDNAME_32_BIT_DECODE);
}
ci sono modi sicuramente più carine per farlo. L'ho appena eseguito in un debugger e guardo i contenuti di out.
Vale anche la pena notare, contrariamente alla risposta di Ignacio, la differenza tra i nomi alterati per le cdecl
metodi nella DLL e il stdcall
metodi per essere guardato era YAAAV
vs. YGAAV
.
- 1. Come pacchettizzare 2 dll di terze parti
- 2. Errore di convenzione di chiamata DLL errata
- 3. ridenominazione di una dll di terze parti in .net
- 4. La DLL di terze parti non ha il "nome sicuro"?
- 5. Devo firmare digitalmente DLL di terze parti come JSON.NET?
- 6. dotPeek Problema di debug di terze parti .dll
- 7. Eseguire il file DLL di terze parti con PowerShell
- 8. Runtime Error 49, Bad DLL convenzione di chiamata
- 9. Override di terze parti JS
- 10. Come allegare librerie di terze parti nella versione di rilascio
- 11. COM surrogato per componente di terze parti
- 12. Gestione delle dipendenze interne di terze parti
- 13. Esiste una classe di caching Python standard di terze parti?
- 14. VBA di Excel: "Errore di run-time '49': Convenzione di chiamata DLL non valida" chiamata C++ dll
- 15. Come ottenere cookie di terze parti?
- 16. Posizione di Dll di terze parti in Controllo versione per .NET Progetto
- 17. Come internazionalizzare una libreria di terze parti PHP
- 18. Come posso importare una lib di terze parti in git?
- 19. connessione del servizio WCF con terze parti DLL con IIS
- 20. Evitare di copiare DLL di terze parti nella cartella di debug
- 21. Programma di arresti anomali di dll di terze parti senza eccezioni generate
- 22. resignFirstResponder() in tastiere di terze parti
- 23. Librerie di terze parti in CMake
- 24. Iniezione JavaScript su pagine di terze parti
- 25. Applicazione dei metodi di terze parti virtualità
- 26. WCF - Autenticazione applicazione di terze parti
- 27. JS di terze parti in Angular2 typescript
- 28. Delphi thiscall convenzione di chiamata
- 29. macdeployqt e librerie di terze parti
- 30. Django's I18N con app di terze parti
Grazie mille Ignacio Vazquez-Abrams. C'è un altro modo efficace per scoprirlo? c'è qualche funzione di libreria per ottenere la convenzione di chiamata? – RoboAlex
Questo naturalmente presuppone che la DLL sia compilata da MSVC, come dice l'articolo collegato nell'introduzione. Suppone anche che non ci sia un file DEF usato. Basta provare a trovare la convenzione di chiamata utilizzata da USER32.DLL con questo metodo - non funziona. – MSalters