uruchomienie DLL z programu

0

Witam,

Chcialbym uruchomic zewnetrzna DLL-e podczas dzialania programu.

Mam cos takiego:

	HINSTANCE hand;

	char *buffer_module = new char[_MAX_PATH];

//tutaj znajduje sciezke "C:\module\" i przechowuje w buffer_module
       
	strcat(buffer_module, "INP.DLL");

	hand = LoadLibrary((LPCTSTR)buffer_module);

	if (hand == NULL)
		throw runtime_error("Can't load dll, check the path " + string(buffer_module));

,gdzie buffer module przechowuje prawdiłowa sciezke do modulu DLL. Niestety wyskakuje caly czas blad 'hand = NULL' a podczas debugowania w lini komend pojawia sie:
'Loaded 'C:\module\INP.DLL', no matching symbolic information found.' <- Sciezka ta jednak jest prawidlowa.

Ma ktos pomysl jak to naprawic i co jest nie tak ze nie moge zaladowac tej dlllki?

0

LoadLibrary((LPCTSTR)buffer_module); <- to rzutowanie do LPCTSTR jest zajebiście brzydkie i niepotrzebne i jeśli kompilujesz program w trybie UNICODE to masz przyczynę błędu

jeśli nie może DLLka jest po prostu niepoprawną binarką i LoadLibrary failuruje pomimo istnienia pliku,
najlepiej sprawdź co zwraca GetLastError po wywołaniu LoadLibrary, tu masz tabelę błedów, dowiedz się o co mu chodzi i popraw: http://msdn.microsoft.com/en-us/library/ms681381.aspx

0

Dzieki za zaintersowanie!

Dodalem zaraz po LoadLibrary:

DWORD err = GetLastError();

Podczas debugfowania err = 126 czyli "ERROR_MOD_NOT_FOUND
126 (0x7E)
The specified module could not be found."

Dziwi mnie to gdyz sciezka jest prawidlowa jak rowniez nazwa DLL-ki.

Moze trzeba isc inna droga mi juz brakuje pomyslow do testowania, takze prosze o dalsza pomoc.

PS Z rzutowaniem LPSCTR i bez dziala tak samo:/

0

A jak wpisujesz ścieżkę? Jesli ręcznie, to czy dajesz podwójnego \ ?

0

Sciezka jest na pewno dobra - sprawdzilem kilka razy podczas debugowania. Sciezke pobieram za pomoca petli

	int i=0, counter=0;

	while(buffer[i]!='\0')
	{
		if(buffer[i]=='\\') counter=i;
		i++;
	}

	char *buffer_module = new char[_MAX_PATH];

	strncpy(buffer_module,buffer,counter+2);
	buffer_module[counter+1]='\0';

	strcat(buffer_module, "INP.DLL");

	hand = LoadLibrary((LPTSTR)buffer_module);
	
	DWORD err = GetLastError();

	//gbOuterDll = true;

	if (hand == NULL)
		throw runtime_error("Can't load dll, check the path " + string(buffer_module));
0

Wyzeruj buffer_module po zaalokowaniu. To, że dasz:

buffer_module[counter+1]='\0';

nic Ci nie da, bo później doklejasz:

strcat(buffer_module, "INP.DLL");

a za tym nie ustawiasz zera. Więc Twoja ścieżka może wyglądać tak:

C:\module\INP.DLL*i*jakieś*śmieci@#$%#$%
0

hmm wydaje mi sie ze jezeli by byly smieci to powinny one zostac wypisane. dodalem jednak
strcat(buffer_module, "NTC_INP_02.DLL\0");

0

krótka piłka:

strcat(buffer_module, "INP.DLL");
MessageBox(NULL,buffer_module,NULL,NULL);
hand = LoadLibrary((LPCTSTR)buffer_module);
0

Moja pomyłka, funkcja strcat dokleja jednak \0 do stringa.

0

Tak jest, sciezki i nazwy sa prawidlowe ale mimo tego 'hand' zwraca NULL ://

0

Weź daj więcej kodu. Jak i gdzie wypełniasz buffer...


Albo weź załaduj tym samym kodem inną bibliotekę. Zobaczy czy pójdzie.

0

Dolaczylem inna DLL-ke (INP2.DLL) i zadzialalo, tzn 'hand' nie zwrocil NULL! - sukces. Polowiczny jednak gdyz w programie musze uzyc INP.DLL. Sama INP.DLL dziala wiec jezeli chodzi o to czy jest w niej jakis blad to raczej odpada...

Macie jakies pomysly co moze byc nie tak ze hand dla INP.DLL zwraca '0'?

0

Oto kod:

long Open(MOD *P1, MODS *P2)
{

	gsInpFile = P2->sFileName; 

	HINSTANCE hand;
	
	char buffer[200];
	
	strcpy(buffer, gsInpFile.c_str());

	int i=0, counter=0;

	while(buffer[i]!='\0')
	{
		if(buffer[i]=='\\') counter=i;
		i++;
	}

	char *buffer_module = new char[_MAX_PATH];

	strncpy(buffer_module,buffer,counter+2);
	buffer_module[counter+1]='\0';

	strcat(buffer_module, "INP.DLL");
		
	//MessageBox(NULL,buffer_module,NULL,NULL);
	hand = LoadLibrary((LPCTSTR)buffer_module);
	
	DWORD err = GetLastError();

	//gbOuterDll = true;

	if (hand == NULL)
		throw runtime_error("Can't load dll, check the path " + string(buffer_module));
	
	// If everything was OK return true
	return LTRUE;
}
0

U mnie działa ten kod, więc najprawdopodobniej to wina DLL. Nic więcej nie wykombinuję.

0

"INP.DLL" na pewno to jest poprawna nazwa? wszystko z dużej, nie pamiętam czy LoadLibrary jest case-sensitive, a może jest

jesli to nie pomoże pokombinuj przez SetDllDirectory poczytaj może w Remarks LoadLibrary coś znajdziesz

0

Udalo sie, zamiast LoadLibrary(...) uzylem funkcji:

hand = LoadLibraryEx((LPCTSTR)buffer_module, NULL, LOAD_WITH_ALTERED_SEARCH_PATH /LOAD_LIBRARY_AS_DATAFILE/);

i dzialaaa :)))

Dzieki za wszelka pomoc.

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