![]() |
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! |
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 |
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: |
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*/ } |
schade um die formatierung.
ausserdem hab ich den letzten 'else' mit einer MessageBox vergessen :eek: |
VB?
Und wie kann ich diese Funktionen dann von VB 6.0 aus ansprechen??
Trotzdem einmal danke, ich werd's probieren!!! |
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 ;) |
Danke!
Danke! Wird sofort ausprobiert!
Fehler:
|
Und VB meldet immer den "Laufzeitfehler 543: DLL-Einsprungpunkg Info in c_dll.dll nicht gefunden" :(
|
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) |
Ich habs so gemacht:
c_dll.cpp: long APIENTRY xyz (long a) { return (a); } c_dll.def: LIBARY c_dll EXPORTS xyz @1 VB: private declare function xyz lib "c_dll" (byval a as long) Des funkt auch, is aber anders wie das oben -> gibts dadurch Probleme oder Unterschiede?? ======================================= Andere Frage: ist es auch möglich C-Klassen zu exportieren und in VB zu verwenden? |
"Des funkt auch, is aber anders wie das oben -> gibts dadurch Probleme oder Unterschiede??"
Da bin ich überfragt, aber wenn es funktioniert sollte es zu keinen weiteren problemen kommen. Bekommst du den wert auch wieder zurück!? "Andere Frage: ist es auch möglich C-Klassen zu exportieren und in VB zu verwenden?" Mir ist keine möglichkeit bekannt wie man c klassen in vb importieren kann. Aber du könntest eine ocx in c schreiben. Die kannst du so programmieren das sie sich ähnlich wie klassen verhalten. |
sorry wegen dem pgdr->hMod (natuerlich war da nur hMod gemeint)
ich hab den code auch zuerst mit diesem dllexport probiert (wie's in der doku beschrieben ist) - aber dann halt mit diesem #if 0 durch APIENTRY ersetzt (damit's halt auch mit VB funzt) (aber damit ich mich an den mist erinnere hab ich diesen alten schrott trotzdem noch drinnen) APIENTRY wird zuerst auf WINAPI und dann in der standardeinstellung von vc auf __stdcall umgesetzt (siehe windef.h) (nachdem die meisten funktionen (z.B: PostMessage) in den header-dateien als WINAPI definiert und auch in VB keine probleme machen (ich aber noch aus OS2-zeiten lieber APIENTRY (wie gesagt: entspricht immer WINAPI) benutze) sollte APIENTRY (oder auch WINAPI) immer den aktuellen einstellungen des betriebssystems entsprechen) der langen rede kurzer sinn: bin davon ueberzeugt, dass das noch die sauberste loesung ist. mit c++, vc++ und irgendwelchen c-klassen kenn ich mich ueberhaupt nicht aus. (bin mit dem guten alten C recht zufrieden) |
Danke Leute! Ihr habt mir trotzdem schon sehr viel geholfen, weil das, was ich machen wollte, funkt jetzt! Und mit den anderen "Kleinigkeiten" kann ich ja eh noch ein bisschen herumprobieren!
mfg |
| Alle Zeitangaben in WEZ +2. Es ist jetzt 15:04 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
© 2009 FSL Verlag