![]() |
![]() |
|
![]() |
![]() |
|
Programmierung Rat & Tat für Programmierer |
![]() |
|
Themen-Optionen | Ansicht |
![]() |
#1 |
Inventar
![]() Registriert seit: 08.02.2000
Beiträge: 1.696
|
![]() 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 ![]() Danke!
____________________________________
Sex is like hacking. You get in, you get out, and you hope you didnt leave something behind that can be traced back to you. |
![]() |
![]() |
![]() |
#2 |
Inventar
![]() Registriert seit: 08.02.2000
Beiträge: 1.696
|
![]() 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
____________________________________
Sex is like hacking. You get in, you get out, and you hope you didnt leave something behind that can be traced back to you. |
![]() |
![]() |
![]() |
#3 |
Inventar
![]() Registriert seit: 08.02.2000
Beiträge: 1.696
|
![]() 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.... ![]()
____________________________________
Sex is like hacking. You get in, you get out, and you hope you didnt leave something behind that can be traced back to you. |
![]() |
![]() |
![]() |
#4 |
Newbie
![]() Registriert seit: 21.05.2001
Alter: 56
Beiträge: 17
|
![]() 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*/ } |
![]() |
![]() |
![]() |
#5 |
Newbie
![]() Registriert seit: 21.05.2001
Alter: 56
Beiträge: 17
|
![]() schade um die formatierung.
ausserdem hab ich den letzten 'else' mit einer MessageBox vergessen ![]() |
![]() |
![]() |
![]() |
#6 |
Inventar
![]() Registriert seit: 08.02.2000
Beiträge: 1.696
|
![]() Und wie kann ich diese Funktionen dann von VB 6.0 aus ansprechen??
Trotzdem einmal danke, ich werd's probieren!!!
____________________________________
Sex is like hacking. You get in, you get out, and you hope you didnt leave something behind that can be traced back to you. |
![]() |
![]() |
![]() |
#7 |
Newbie
![]() Registriert seit: 21.05.2001
Alter: 56
Beiträge: 17
|
![]() 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 ![]() |
![]() |
![]() |
![]() |
#8 |
Inventar
![]() Registriert seit: 08.02.2000
Beiträge: 1.696
|
![]() Danke! Wird sofort ausprobiert!
Fehler:
____________________________________
Sex is like hacking. You get in, you get out, and you hope you didnt leave something behind that can be traced back to you. |
![]() |
![]() |
![]() |
#9 |
Inventar
![]() Registriert seit: 08.02.2000
Beiträge: 1.696
|
![]() Und VB meldet immer den "Laufzeitfehler 543: DLL-Einsprungpunkg Info in c_dll.dll nicht gefunden"
![]()
____________________________________
Sex is like hacking. You get in, you get out, and you hope you didnt leave something behind that can be traced back to you. |
![]() |
![]() |
![]() |
#10 |
Master
![]() |
![]() 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)
____________________________________
__________________ |»»»»»SONIC««««««| ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ |
![]() |
![]() |
![]() |
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | |
|
|