Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[WinAPI] Pobranie adresu funkcji z DLL i wywołanie jej

Ostatnio zmodyfikowano 2012-12-22 13:45
Autor Wiadomość
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:

C/C++
void QuickInstall()
{
    char path[ MAX_PATH ];
    char message[] = "QUICK INSTALL PROCEDURE \n";
   
    //SHGetSpecialFolder(NULL, &path, CSIDL_PROGRAM_FILES, NULL);
    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" );
   
    // TUTAJ PROBLEM:
    shgetspecialfolderpath( NULL, path, CSIDL_PROGRAM_FILES, FALSE );
   
}
P-71637
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 :)
P-71640
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:

C/C++
#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:
C/C++
#ifndef _WIN32_IE
#define _WIN32_IE  0x0400
#endif // _WIN32_IE
#include <shlobj.h>

P-71642
kubawal
» 2012-12-22 12:02:56
Spróbuj:
( shgetspecialfolderpath )( /*argumenty*/ );
P-71643
xevuel
» 2012-12-22 12:05:05
» Kurs WinAPI, C++ » ZaawansowaneDLL lekcja
Sekcja "Dynamiczne linkowanie funkcji", ale jeśli przeczytasz całe, na pewno na tym nie stracisz ;)

Czy to w tym problem ?
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ć
C/C++
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ą :)
P-71645
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.
P-71649
xevuel
» 2012-12-22 12:44:02
zrobiłem jak w przykładzie dalej ten sam error.
C/C++
void QuickInstall()
{
    char path[ MAX_PATH ];
    char message[] = "QUICK INSTALL PROCEDURE \n";
   
    //SHGetSpecialFolder(NULL, &path, CSIDL_PROGRAM_FILES, NULL);
    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" );
   
    // TUTAJ PROBLEM:
    #define CSIDL_PROGRAM_FILES 0x0026
    ( shgetspecialfolderpath )( NULL, path, CSIDL_PROGRAM_FILES, FALSE );
   
}
Proszę. A jeśli uważasz temat za rozwiązany - zamknij go :)
P-71651
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ą :)
P-71656
« 1 »
  Strona 1 z 1