WCM Forum

WCM Forum (http://www.wcm.at/forum/index.php)
-   Programmierung (http://www.wcm.at/forum/forumdisplay.php?f=17)
-   -   DLL in Standard C ansprechen/programmieren (http://www.wcm.at/forum/showthread.php?t=25334)

SNo0py 10.07.2001 14:57

DLL in Standard C ansprechen/programmieren
 
An alle guten C-Programmierer:

Ich habe eine DLL (inicrs.dll) und möchte eine neue DLL (vbinicrs.dll) schreiben, in welcher ich eine Funktion der ersten DLL mit 4 Parametern anspreche und gleichzeitig eine Funktion mit 2 Parametern zur Verfügung stelle! Klar?! Sicher net, oder?

Also:
Der Programmierer spricht funktion(param1, param2) in meiner DLL an.
Diese DLL ruft eine weitere DLL auf und übergibt param1 und param2 plus zwei weitere Parameter an diese.

Sinn: die Funktion mit 4 Parameter lässt sich auch VB heraus nicht ansprechen -> _cdecl -> durch Kapselung in eine neue DLL möchte ich _stdcall verwenden und mir gleichzeitig 2 Parameter ersparen!

Grund: bin VB-Programmierer :D

Danke!

SNo0py 10.07.2001 14:58

Headerfile
 
Im Headerfile, dass ich für meine inicrs.dll habe, steht folgendes:

DWORD CreateIniCheckSum(LPCTSTR lpIniPath, LPCTSTR lpPwd, LPWORD pMonth, LPWORD pYear);

Und den pMonth und PYear möcht ich mir sparen (wird 0 übergeben und das aktuelle Monat zurückgegeben, das brauch i aber net!)

mfg

SNo0py 10.07.2001 15:59

Es wäre mir auch schon sehr viel geholfen, wenn ich kapieren würde, wie ich DLLs in VC 6.0 einbinde -> in meinen Sample-Programmen wird einfach die Funktion aufgerufen, ohne Headerfile :(

Dieser Programmierer gehört.... :mad:

kfal 10.07.2001 16:53

schreibe meien DLLs meistens so:

welchen exporttyp man auch immer will:
#if 0
# ifdef DLL_EXPORTS
# define DLL_API __declspec(dllexport)
# else
# define DLL_API __declspec(dllimport)
# endif
#else
# ifdef DLL_EXPORTS
# define DLL_API
# else
# define DLL_API
# endif
#endif
/* ohne (dllexport) muss noch eine datei 'dll.exp' angelegt werden, in der */
/* fuer jede exportierte funktion so ein eintrag existiert: */
/* EXPORTS Info */



dll_source.c
DLL_API long APIENTRY Info
(
long lLen,
char *pszInfo
)
{
long lRet=0;
...
return (lRet);
}


benutzt wird eine dll dann folgendermassen (ohne lib und header muss aber trotzdem bekannt sein, welche parameter benoetigt werden!):


HANDLE hMod;
FARPROC procINFO;
char szText[64];


hMod = LoadLibrary ("dll"); /* die dll wird im programm-verzeichnis */
/* und im PATH gesucht */
if (hMod != NULL)
{
procINFO = GetProcAddress (
pgdr->hMod, "Info");
if (!procInfo)
{
MessageBox (pgdr->hwndMain,
"DLL nicht initialisiert!",
"DLL", MB_OK);
}
else
{
lRet = (*procINFO)(sizeof (szText), szText); /* funktion aufrufen */
}
FreeLibrary (hMod); /* DLL wieder freigeben*/
}

kfal 10.07.2001 16:57

schade um die formatierung.

ausserdem hab ich den letzten 'else' mit einer MessageBox vergessen :eek:

SNo0py 10.07.2001 17:04

VB?
 
Und wie kann ich diese Funktionen dann von VB 6.0 aus ansprechen??

Trotzdem einmal danke, ich werd's probieren!!!

kfal 10.07.2001 17:24

Declare Function Info Lib "DLL.DLL" ( _
ByVal lLen As Long, _
ByVal szText As String) as Long


Sub X
Dim szText as String
Dim lRet as Long

szText=Space(128)
lRet = Info (127, szText)
...
End Sub

;)

SNo0py 11.07.2001 09:36

Danke!
 
Danke! Wird sofort ausprobiert!

Fehler:
  • __declspec(dllexport) long APIENTRY Info (long lLen, char *pszInfo) -> das Makro funkt nicht!
  • pgdr->hMod: des kennt er net... :-(

SNo0py 11.07.2001 10:10

Und VB meldet immer den "Laufzeitfehler 543: DLL-Einsprungpunkg Info in c_dll.dll nicht gefunden" :(

Sonic 11.07.2001 12:34

hi!

Vb findet den einsprungspunkt nicht weil der exportname der funktion in der Dll vorne einen underscore bekommen hat und hinten dran ein @ mit einer ordinalzahl.

Beispiel: _MyFunc@12

Du kannst dir den richtigen namen der funktion anschauen wenn du mit rechter maustaste auf die datei clickst und auf schnellansicht gehst. Oder du übergibst dem linker den schalter "/MAP". Dann wird eine name.map datei erzeugt in der alle import und export dateien aufgelistet werden.
(such einfach nach deiner)

IMHO ist die beste methode jedoch eine def datei zu erstellen und dort einen export namen anzugeben (und man ersparrt sich dadurch auch _declspec(dllexport) ).

Beispiel:

//mydll.c

//Funktion die exportiert werden soll
// extern "c" und _stdcall sind wichtig sonst funktionierts in vb nicht
extern "C" double __stdcall AddIt(int a, int b)
{
return a+b;
}

---------------------------------------

//mydll.def

LIBRARY MYDLL
DESCRIPTION "Exportiert addit" //beschreibung
EXPORTS // export section
Addit =_AddIt@8 // externer name = name aus der map datei bzw. von schnellansicht

ich hoffe ich hab mich verständlich ausgedrückt und das es dir weiter hilft. (Ich hab lang gebraucht bis ich meine erste selbstgeschriebene dll in vb verwenden konnte)


Alle Zeitangaben in WEZ +2. Es ist jetzt 13:27 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
© 2009 FSL Verlag