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
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é
@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é
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é

