2010-11-12 14 views
17

Czy ktoś może mi wyjaśnić, jak poznać konwencję wywołania biblioteki DLL bez pobierania i przetwarzania nazw metod? Powiedzmy, że nasza aplikacja ładuje dll strony trzeciej i aby sobie z tym poradzić, czy istnieją skuteczne sposoby na poznanie konwencji wywołania biblioteki DLL? (__stdcall, __cdecl, __fastcall)Jak znaleźć konwencję wywołania biblioteki DLL innej firmy?

Odpowiedz

23

Jeśli symbol zaczyna się od _, ale nie ma @, to jest __cdecl. Jeśli zaczyna się od _ i ma @, to jest __stdcall. Jeśli zaczyna się od @ i ma inną @, jest to __fastcall.

source

+0

Bardzo dziękuję Ignacio Vazquez-Abrams. Czy istnieje inny skuteczny sposób, aby to sprawdzić? czy są jakieś funkcje biblioteczne, aby uzyskać konwencję wywoływania? – RoboAlex

+7

Zakłada to oczywiście, że biblioteka DLL została skompilowana przez MSVC, o czym wspomina artykuł na wstępie. Zakłada się także, że nie ma pliku DEF. Po prostu spróbuj znaleźć konwencję wywołania używaną przez USER32.DLL za pomocą tej metody - nie działa. – MSalters

1

Starając się zrozumieć, dlaczego byłem coraz symbole nierozwiązanych podczas łączenia przed dll trzecich natknąłem się (w pewnym sensie) rozwiązania programowe.

napisałem mały program przeciwko API Windows przy użyciu UnDecorateSymbolName z Dbghelp.h zdekodować schemat maglowania:

#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); 
} 

Są zdecydowanie ładniejsze sposobów, aby to zrobić. Po prostu uruchamiam go w debugerze i sprawdzam jego zawartość.

Warto również zauważyć, w przeciwieństwie do odpowiedzi Ignacio jest różnica między zniekształconych nazw dla cdecl metod w DLL i metod stdcall poszukiwane był YAAAV vs. YGAAV.

Powiązane problemy