codex Temat założony przez niniejszego użytkownika |
[WinAPI] Pobranie adresu funkcji z DLL i wywołanie jej » 2012-12-22 11:41:52 Witam ponownie od rana zaczynam "walkę" ponieważ nie udało mi się rozpracować problemów w pliku nagłówkowym atakuję problem w inny sposób i znowu katastrofa. - Ładuję bibliotekę LoadLibrary("Shell32.dll"). Uzyskuje adres interesującej mnie procedury GetProcAddress(hshell32, "SHGetSpecialFoderPath"). Sprawdza błędy - wszystko gra więc wywołuję uzyskaną procedurę i wywala error, że zbyt wiele parametrów przekazałem do wywoływanej funkcji - jestem pewien, że liczba i paramery są poprawne. oto kod: void QuickInstall() { char path[ MAX_PATH ]; char message[] = "QUICK INSTALL PROCEDURE \n"; HMODULE hshell32 = LoadLibrary( "Shell32.dll" ); if( !hshell32 ) { printf( "\n\t nie udalo sie zaladowac biblioteki shell32.dll" ); return; } printf( "\n\t zaladowano biblioteke shell32.dll" ); FARPROC WINAPI shgetspecialfolderpath = GetProcAddress( hshell32, "SHGetSpecialFolderPathA" ); if( !shgetspecialfolderpath ) { printf( "\n\t nie udalo sie uzyskac adresu procedury SHGetSpecialFolderPath" ); return; } printf( "\n\t uzyskano adres procedury SHGetSpecialFolderPath" ); shgetspecialfolderpath( NULL, path, CSIDL_PROGRAM_FILES, FALSE ); }
|
|
kubawal |
» 2012-12-22 11:51:10 Wzięte z MSDN: (SHGetSpecialFolderPathA) Requirements: Minimum supported client Windows 2000 Professional [desktop apps only] Minimum supported server Windows 2000 Server [desktop apps only] End of client support Windows 2000 Professional End of server support Windows 2000 Server
|
Działa tylko na Win2000 Professional :) |
|
codex Temat założony przez niniejszego użytkownika |
» 2012-12-22 12:01:27 Właśnie napisałem szybko programik w asm który robi dokładnie to samo - system z którego korzystam nie stawia przeszkód - działa elegancko. Dziwne - faktycznie na msdn tak jest napisane a ja kożystam z windows7 ... no tak czy siak ta funkcja jest exportowana przez Shell32.dll najwyraźniej natomiast nie ma jej zdefiniowanej w plikach nagłówkowych c++. W pliku <shlobj.h> jest tak: #if (_WIN32_IE >= 0x0400) BOOL WINAPI SHGetSpecialFolderPathA( HWND, LPSTR, int, BOOL ); BOOL WINAPI SHGetSpecialFolderPathW( HWND, LPWSTR, int, BOOL ); #endif
Czy to w tym problem ? Zrobiłem jak niżej ale też nie diała: #ifndef _WIN32_IE #define _WIN32_IE 0x0400 #endif #include <shlobj.h>
|
|
kubawal |
» 2012-12-22 12:02:56 Spróbuj: ( shgetspecialfolderpath )( ); |
|
xevuel |
» 2012-12-22 12:05:05 DLLSekcja "Dynamiczne linkowanie funkcji", ale jeśli przeczytasz całe, na pewno na tym nie stracisz ;) Wypisz sobie wartość _WIN32_IE, aby się przekonać. Jeśli jest większa lub równa 0x0400, a program i tak się nie chce skompilować, wrzuć BOOL WINAPI SHGetSpecialFolderPathA( HWND, LPSTR, int, BOOL ); BOOL WINAPI SHGetSpecialFolderPathW( HWND, LPWSTR, int, BOOL ); #ifdef UNICODE #define SHGetSpecialFolderPath SHGetSpecialFolderPathW #else #define SHGetSpecialFolderPath SHGetSpecialFolderPathA #endif zaraz po includach. Powinieneś móc wtedy używać tej funkcji bez zbędnej zabawy z dynamicznym ładowaniem DLLek. No i rzecz najważniejsza - nawet jeśli coś tam działa, a jest zdeprecjonowane, nie należy tego używać, bo w każdej chwili może przestać działać. MSDN podaje jako zastępstwo funkcję [MSDN] SHGetFolderPath , wypróbuj ją :) |
|
codex Temat założony przez niniejszego użytkownika |
» 2012-12-22 12:10:22 @kubwal: tak. zrobiłem jak proponowałeś - ten sam error ( za dużo parametrów ). @xevuel: Zabieram się do czytania. Informacji nigdy za wiele.
Przeczytałem - elegancko, że można używać klas zawartuch w dllkach (bo już zaczynałem myśleć, że ten cały c++ nie wiele mi się przyda). Co do sposobu importowania dynamicznego - zrobiłem jak w przykładzie dalej ten sam error. Ale ostatecznie skożystam z funkcji SHGetFolderPath - łatwiejsze rozwiązanie faktycznie. Po prostu chyba przywykłem, że w takiej sytuacji korzystam z jakiejś funkcji i próbuję jak ślepy koń w westernie nie widząc przeszkód do przodu :)
EDIT: No i działa elegancko. Dzięki.
|
|
xevuel |
» 2012-12-22 12:44:02 zrobiłem jak w przykładzie dalej ten sam error. |
void QuickInstall() { char path[ MAX_PATH ]; char message[] = "QUICK INSTALL PROCEDURE \n"; HMODULE hshell32 = LoadLibrary( "Shell32.dll" ); if( !hshell32 ) { printf( "\n\t nie udalo sie zaladowac biblioteki shell32.dll" ); return; } printf( "\n\t zaladowano biblioteke shell32.dll" ); typedef __attribute__(( __stdcall__ ) ) BOOL( * MYPROC )( HWND, LPTSTR, int, BOOL ); MYPROC WINAPI shgetspecialfolderpath =( MYPROC ) GetProcAddress( hshell32, "SHGetSpecialFolderPathA" ); if( !shgetspecialfolderpath ) { printf( "\n\t nie udalo sie uzyskac adresu procedury SHGetSpecialFolderPath" ); return; } printf( "\n\t uzyskano adres procedury SHGetSpecialFolderPath" ); #define CSIDL_PROGRAM_FILES 0x0026 ( shgetspecialfolderpath )( NULL, path, CSIDL_PROGRAM_FILES, FALSE ); }
Proszę. A jeśli uważasz temat za rozwiązany - zamknij go :) |
|
codex Temat założony przez niniejszego użytkownika |
» 2012-12-22 13:45:31 Tak. Dzięki, to zupełne rozwiązanie problemu z nawiązką :)
|
|
« 1 » |