DLL Funktion

also das problem ist, dass die GetProcAdress(...) einen fehler returned... das habe ich nun schon durch printf("fehler"); und so herrausgefunden.

ich weiß nur nicht WO der fehler ist und WIE ich ihn beheben kann.

also hier mal ein etwas ausführlicherer auszug des programms und der dll:

programm:

Code:
void main()
{
typedef void (*Init)(void);
HINSTANCE hDLL;               // DLL-Zugriffsnummer  
Init Func;    // Funktionszeiger
hDLL = LoadLibrary("dll_test.dll");
if( hDLL != NULL)
{	Func = (Init)GetProcAddress(hDLL,"Init");
	if( !Func) printf("fehler");
}
return;
}

dll:

Code:
#include "stdafx.h"
#pragma data_seg(".adshared")
#pragma data_seg()
#pragma comment(linker, "/SECTION:.adshared,RWS")

BOOL APIENTRY DllMain( HANDLE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved)
{
	switch (ul_reason_for_call)
	{ 
		case DLL_PROCESS_ATTACH:
		case DLL_THREAD_ATTACH: 
		case DLL_THREAD_DETACH:
		case DLL_PROCESS_DETACH:
		break;
	}
	return TRUE;
}

void Init(void)
{
	return;
}
 
es lohnt sich auf jeden fall einfach mal die dokumentation zu den funktionen zu lesen die man verwendet...

Parameters

hModule
[in] Handle to the DLL module that contains the function or variable. The LoadLibrary or GetModuleHandle function returns this handle.

lpProcName
[in] Pointer to a null-terminated string that specifies the function or variable name, or the function's ordinal value. If this parameter is an ordinal value, it must be in the low-order word; the high-order word must be zero.

Return Values

If the function succeeds, the return value is the address of the exported function or variable.

If the function fails, the return value is NULL. To get extended error information, call GetLastError.

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/getprocaddress.asp
 
also ich WEISS hundertprozentig das es diese funktion in der dll gibt, da ich (schließlich habe ich den source code) die dll kompiliert habe...

woran könnte das denn liegen?

könnte jemand vlt einfach mal ein generelles ganz simples beispiel posten?! vlt mach ich ja irgendwas grundlegenedes IN der dll oder IM programm falsch...
 
Original von NULL!=NULL
also ich WEISS hundertprozentig das es diese funktion in der dll gibt, da ich (schließlich habe ich den source code) die dll kompiliert habe...

woran könnte das denn liegen?

könnte jemand vlt einfach mal ein generelles ganz simples beispiel posten?! vlt mach ich ja irgendwas grundlegenedes IN der dll oder IM programm falsch...

Wenn du von diesem Sourcecode sprichst, dann gibt es die Funktion definitiv nicht:
Code:
#include "stdafx.h"
#pragma data_seg(".adshared")
#pragma data_seg()
#pragma comment(linker, "/SECTION:.adshared,RWS")

BOOL APIENTRY DllMain( HANDLE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved)
{
	switch (ul_reason_for_call)
	{ 
		case DLL_PROCESS_ATTACH:
		case DLL_THREAD_ATTACH: 
		case DLL_THREAD_DETACH:
		case DLL_PROCESS_DETACH:
		break;
	}
	return TRUE;
}

void Init(void)
{
	return;
}

Falls nicht, poste mal den Sourcecode der DLL. (Falls diese Funktion existiert, tippe ich mal darauf, dass sie nicht exportiert wird)
 
ich (als nicht C++ ;) )kann auch keinerlei Exportfanweisungen entdecken. Bedenke, dass nach außen sichbare Funktionen exportieren muss (vielleicht mit "Export void Test" oder so ähnlich).
 
Original von Lesco
Original von NULL!=NULL
also ich WEISS hundertprozentig das es diese funktion in der dll gibt, da ich (schließlich habe ich den source code) die dll kompiliert habe...

woran könnte das denn liegen?

könnte jemand vlt einfach mal ein generelles ganz simples beispiel posten?! vlt mach ich ja irgendwas grundlegenedes IN der dll oder IM programm falsch...

Wenn du von diesem Sourcecode sprichst, dann gibt es die Funktion definitiv nicht:
Code:
#include "stdafx.h"
#pragma data_seg(".adshared")
#pragma data_seg()
#pragma comment(linker, "/SECTION:.adshared,RWS")

BOOL APIENTRY DllMain( HANDLE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved)
{
	switch (ul_reason_for_call)
	{ 
		case DLL_PROCESS_ATTACH:
		case DLL_THREAD_ATTACH: 
		case DLL_THREAD_DETACH:
		case DLL_PROCESS_DETACH:
		break;
	}
	return TRUE;
}

void Init(void)
{
	return;
}

Falls nicht, poste mal den Sourcecode der DLL. (Falls diese Funktion existiert, tippe ich mal darauf, dass sie nicht exportiert wird)

so ich habe mich bei einer sache HIER vertan... habs jetz in meiner ersten post geändert so wies bei mir im source code steht...

@cdw:
also ich glaube diese export anweisungen müssen nur bei mfc erstellten dlls sein, oder?
ich weiß es nicht... ich probiers mal aus ;)
 
wenn Du die kompletten Binarys anhängst (am besten als Release und nicht als Debug -Version) könnte ich meinen Olly fragen, was genau da nicht stimmt. Bzw. man könnte auch überprüfen, ob die DLL "richtig" ist.

also ich glaube diese export anweisungen müssen nur bei mfc erstellten dlls sein, oder?
Naja, irgendwie muss der Comliler/Linker schon wissen, welche Funktionen er exportieren kann/muss. Also in MASM muss man das auch angeben :). Und die beiden Seiten sagen auch nix anderes:
http://www.logix4u.net/dll_tutorial1.htm
http://www.zetnet.co.uk/rad/dll.html
 
Probier einfach mal Probeweise

Code:
#include "stdafx.h"
#pragma data_seg(".adshared")
#pragma data_seg()
#pragma comment(linker, "/SECTION:.adshared,RWS")

BOOL APIENTRY DllMain( HANDLE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved)
{
	switch (ul_reason_for_call)
	{ 
		case DLL_PROCESS_ATTACH:
		case DLL_THREAD_ATTACH: 
		case DLL_THREAD_DETACH:
		case DLL_PROCESS_DETACH:
		break;
	}
	return TRUE;
}

void __declspec(dllexport) Init(void)
{
	return;
}

( so wird dem Compiler halt mitgeteilt, dass er Init exportieren soll )
 
also: exportiert werden hier nur folgende Funktonenen:

Code:
dll_test2.dll ??0CDll_test2@@QAE@XZ ??4CDll_test2@@QAEAAV0@ABV0@@Z ?fnDll_test2@@YAHXZ ?nDll_test2@@3HA
ob diese exports nur wegen der Debug-Version existieren, kann ich nicht sagen,allerdings sehen "normale" Exports so aus:


Code:
GetHttpFile.dll GetHttpFile GetHttpFileEx GetHttpFileExtreme
Code:
BASSMOD_GetVolume BASSMOD_Init BASSMOD_MusicDecode BASSMOD_MusicFree BASSMOD_MusicGetLength BASSMOD_MusicGetName BASSMOD_MusicGetPosition BASSMOD_MusicGetVolume BASSMOD_MusicIsActive BASSMOD_MusicLoad BASSMOD_MusicPause BASSMOD_MusicPlay BASSMOD_MusicPlayEx BASSMOD_MusicRemoveSync BASSMOD_MusicSetAmplify BASSMOD_MusicSetPanSep BASSMOD_MusicSetPosition BASSMOD_MusicSetPositionScaler BASSMOD_MusicSetSync BASSMOD_MusicSetVolume BASSMOD_MusicStop BASSMOD_SetVolume BASSMOD.dll
also schon "im Klartext" (es gibt auch eine andere Methode, über Orinalvalue)
In StandardDLLs müssen auf jedenfall Exports rein. Ob MS VC++ auch einen "Eigenformat" hat, weiß ich nicht (kann gut sein :rolleyes: ). Aber falls man über den "offiziellen" Weg mit GetProcAddress gehet, muss die DLL die "Standards" erfüllen. Das sagt auch
http://msdn.microsoft.com/library/en-us/dllproc/base/getprocaddress.asp

The spelling and case of a function name pointed to by lpProcName must be identical to that in the EXPORTS statement of the source DLL's module-definition (.def) file.

so wie ich das sehe, nutzt Du MS VC++ 6.0.
hier gibts, wie schon erwähnt was zu VC++
http://www.logix4u.net/dll_tutorial1.htm
 
Die Namen werden durch C++ Compiler "per default" so "verunstaltet". Die Zeichen danach geben die Größe der Parameter und des Rückgabewerts etc. an.
Wenn man das nicht will, muss man entweder eine .def Datei schreiben oder die Funktion als "extern "C"" deklarieren.
Aber so wie es aussieht sind es irgendwelche "Debug-Exports", da Init hier nirgends auftaucht. __declspec(dllexport) dürfte das Problem lösen.
 
Zurück
Oben