zly argument GetProcAddress

Odpowiedz Nowy wątek
2006-10-24 22:19
leszekszmieszek
0
#include "stdafx.h"
#include <windows.h>

int _tmain(int argc, _TCHAR* argv[])
{
HMODULE handler_libca;
FARPROC adres;

if(argc<3)
    {return 0; }

handler_libca=LoadLibraryW((LPCWSTR)argv[1]); 
if(handler_libca==NULL)
    {
       printf("nie ma takiej dll'ki");

       return 0;
     }  

adres=GetProcAddress(handler_libca,(LPCSTR)argv[2]);
if(adres==NULL)
    {
        printf("nie ma takiej procki");

        return 0;
    }

printf("Adres 0x%x",adres);

}

Srodowisko to VS Express 2005
Kod sie kompiluje lecz caly czas dostaje false na 3 if'e
,czyli

if(adres==NULL)

Dopiero kiedy ustawie na sztywno nazwe funkcji np.

adres=GetProcAddress(handler_libca,(LPCSTR)"Sleep");

aplikacja dziala poprawnie.
Problem jest chyba w kodowaniu zmiennej argv[2] UNICODE ,a powinno byc ASCII.

Pozostało 580 znaków

2006-10-25 09:08
0

No dobra ale po co jawnie wywoływać funkcję Unicode .(LoadLibraryW).
Do kompilacji używa się makra które określa czy program ma być kompilowany
jako Unicode i nikt ręcznie nie będzie wnikał jaka funkcja zostanie wywołana.

To zadanie kompilatora , ty tylko używasz typu zastępującego napisy C
np , zamiast char -> TCHAR i zamiast char -> TCHAR .

Definiując makro UNICODE ( #define UNICODE - przed wszystkimi inkludami ) np. w Builder lub VC++
(i dołączając nagłówek tchar.h zestaw funkcji C dla napisów szerokich w razie potrzeby)
kompilator rozwija
makro TCHAR jako znaki szerokie , jaśli tego makra nie zdefiniujesz jako
zwykły char .Można w ten sposób otrzymać wersję Unicode i zwykłą programu .

Niestety nie wszystkie funkcje w bibliotekach są w wersji UNICODE ,
i czasami trzeba zastosować kompilację warunkową , parę #ifdef
w tresci programu , jesli UNICODE do konwertuj napis z wchar_t na char i wywołaj funkcję .
U mnie np. nie ma wersji unicode GetProcAddress :-(
Pomimo że jest LoadLibraryW , program i tak nie działa poprawnie , na moim
kompilatorze napis z wiersza poleceń jest przekazywany jako unicode , - a jak wprowadzić
nazwę .dll z wiersza poleceń jako UNICODE ?.Bez sensu .


Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0