Supportnet Computer
Planet of Tech

Supportnet / Forum / Anwendungen(Java,C++...)

Visual Studio, DLL generieren, grosse probleme





Frage

hallo zusammen ich benutze visual studio 6 und möchte ein programm schreiben, dass aufgrund seiner komplexität mit selbst geschriebenen dll's arbeiten sollte. nach der lektüre der betreffenden artikel unter msdn.microsoft.com bin ich nun mehr verwirrt als erleuchtet. beschreibung : alle selbstgeschriebenen dlls haben die gleichen funktionen und variablen, der code in den dlls ist aber verschieden. nun, damit ich das programm nicht immer wieder neu bilden muss, möchte ich die dlls NICHT statisch sondern dynamisch einbinden, sprich ohne die .lib dateien. und hier beginnt das problem : in einem kleinen beispielprogramm lade ich nur eine selbstgeschriebene dll, was auch gelingt, GetProcAdress(handle, funktionsname) misslingt und die fehlermeldung GetLastError() bringt zu tage, dass das modul nicht vorhanden sei... ich habe mir nun satte zwei nächte um die ohren gehauen und auch andere seiten im internet (z.b. codeguru.com) durchgeforstet, was meine verwirrung vollendet hat. deshalb meine frage : hat jemand ein einfaches, jedoch eindrückliches beispiel, wie man dlls (mit oder ohne mfcsupport) mit testprogramm, welches funktionen der dll aufruft, erstellt ? mit besten dank im voraus René König

Antwort 1 von Josch


schau mal unter
www.codeguru.com
oder
www.codeproject.com

dort hat es einige anleitungen und beispiele zu dll's und anderen sachen.

grus

josch

Antwort 2 von Kai

Hi, öffne mal Deine MSDN und such nach "LoadLibrary".
Ab da sollte eigentlich alles klar sein. CU Kai

Antwort 3 von René_28

hallo zusammen

@josch
codeguru hat mich nach microsoft vollends um den verstand gebracht ;-)

@kai
mit loadlibrary (und allen anderen möglichkeiten) habe ich es schon probiert. spätestens bei GetProcAdress kommt mit NULL das böse erwachen. s.o. kommt immer "modul wird nicht gefunden".


mittlerweile sitze ich weitere 2 tage (und nächte) am problem und komme keinen schritt weiter. so schwer kanns wohl ja nicht sein, aber ich kriege den dreh nicht raus...

sogar eine mit dem assistenten generierte dll mit einer variablen und einer funktion bringe ich nicht zum laufen *arrrrgg*

mittlerweile kämpfe ich auch noch mit dem linker ;-)

quo vadis, meine nerven :-( ?

Linking...
mfcs42d.lib(dllmodul.obj) : error LNK2005: _DllMain@12 already defined in MP3Plugin.obj
mfcs42d.lib(dllmodul.obj) : error LNK2005: __pRawDllMain already defined in MP3Plugin.obj
mfcs42d.lib(dllmodul.obj) : warning LNK4006: _DllMain@12 already defined in MP3Plugin.obj; second definition ignored
mfcs42d.lib(dllmodul.obj) : warning LNK4006: __pRawDllMain already defined in MP3Plugin.obj; second definition ignored
Creating library Debug/MP3Plugin.lib and object Debug/MP3Plugin.exp
Debug/MP3Plugin.dll : fatal error LNK1169: one or more multiply defined symbols found
Error executing link.exe.

MP3Plugin.dll - 3 error(s), 2 warning(s)


mir würde ehrlich gesagt ein kleines beispiel einer dll reichen (1-2 funktionen) mithilfe von mfc und ein programm, welches die funktionen aufruft. so kann ich wahrscheinlich am besten nachvollziehen, welche schritte dafür nötig sind.

nicht das ich zu faul wäre, um das problem selbst zu lösen, aber der knoten rund ums thema dll wird z.b. mit codeguru.com nicht gerade entwirrt.

rgds
rené

Antwort 4 von Josch


Also nun ein wenig code :

//GetProcAddresses
//Argument1: hLibrary - Handle for the Library Loaded
//Argument2: lpszLibrary - Library to Load
//Argument3: nCount - Number of functions to load
//[Arguments Format]
//Argument4: Function Address - Function address we want to store
//Argument5: Function Name - Name of the function we want
//[Repeat Format]
//
//Returns: FALSE if failure
//Returns: TRUE if successful
BOOL GetProcAddresses( HINSTANCE *hLibrary,
LPCSTR lpszLibrary, INT nCount, ... )
{
va_list va;
va_start( va, nCount );

if ( ( *hLibrary = LoadLibrary( lpszLibrary ) )
!= NULL )
{
FARPROC * lpfProcFunction = NULL;
LPSTR lpszFuncName = NULL;
INT nIdxCount = 0;
while ( nIdxCount < nCount )
{
lpfProcFunction = va_arg( va, FARPROC* );
lpszFuncName = va_arg( va, LPSTR );
if ( ( *lpfProcFunction =
GetProcAddress( *hLibrary,
lpszFuncName ) ) == NULL )
{
lpfProcFunction = NULL;
return FALSE;
}
nIdxCount++;
}
}
else
{
va_end( va );
return FALSE;
}
va_end( va );
return TRUE;
}


typedef int ( WINAPI *MESSAGEBOX )
( HWND , LPCSTR, LPCSTR, DWORD );
typedef int ( WINAPI *MESSAGEBOXEX )
( HWND , LPCSTR, LPCSTR, DWORD , WORD );

void main(void)
{
MESSAGEBOX lpfMsgBox = NULL;
MESSAGEBOXEX lpfMsgBoxEx = NULL;
HINSTANCE hLib;
if(GetProcAddresses( &hLib, "User32.dll", 2,
&lpfMsgBox, "MessageBoxA",
&lpfMsgBoxEx, "MessageBoxExA" ) )
{
lpfMsgBox( 0, "Test1", "Test1", MB_OK );
lpfMsgBoxEx( 0, "Test2", "Test2", MB_OK,
MAKELANGID( LANG_ENGLISH, SUBLANG_ENGLISH_US ) );
}
if ( hLib != NULL )
FreeLibrary( hLib );
}


also das funktioniert bei mir ausgezeichnet. wenn's bei dir nicht tut, so muss du wohl deinen code herausrücken.

gruss

josch

p.s. der code ist von codeproject.com



Antwort 5 von Josch


ja noch was, wie du die dll zusammenbauen musst :

http://www.codeproject.com/useritems/DLL.asp



Antwort 6 von René_28

hallo zusammen

endlich hab ichs erfasst ;-)

das ganze lag "nur" am fehlenden

extern "C"

ich habs immer mit

MYDLL_API int fnMyDLL(void);

versucht.

mit

extern "C" MYDLL_API int fnMyDLL(void);

wäre alles gegangen...

*grummel* wer lesen kann ist mächtig im vorteil ;-)

besten dank für die tip(p)s

rgds
rené

Ich möchte kostenlos eine Frage an die Mitglieder stellen:


Ähnliche Themen:


Suche in allen vorhandenen Beiträgen: