WCM - Das österreichische Computer Magazin Forenübersicht
 

Zurück   WCM Forum > Rat & Tat > Programmierung

Programmierung Rat & Tat für Programmierer

Microsoft KARRIERECAMPUS

Antwort
 
Themen-Optionen Ansicht
Alt 10.07.2001, 13:57   #1
SNo0py
Inventar
 
Registriert seit: 08.02.2000
Beiträge: 1.696


Frage 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

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.
SNo0py ist offline   Mit Zitat antworten
Alt 10.07.2001, 13:58   #2
SNo0py
Inventar
 
Registriert seit: 08.02.2000
Beiträge: 1.696


Ausrufezeichen 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
____________________________________
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.
SNo0py ist offline   Mit Zitat antworten
Alt 10.07.2001, 14:59   #3
SNo0py
Inventar
 
Registriert seit: 08.02.2000
Beiträge: 1.696


Standard

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.
SNo0py ist offline   Mit Zitat antworten
Alt 10.07.2001, 15:53   #4
kfal
Newbie
 
Registriert seit: 21.05.2001
Alter: 56
Beiträge: 17


Standard

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 ist offline   Mit Zitat antworten
Alt 10.07.2001, 15:57   #5
kfal
Newbie
 
Registriert seit: 21.05.2001
Alter: 56
Beiträge: 17


Standard

schade um die formatierung.

ausserdem hab ich den letzten 'else' mit einer MessageBox vergessen
kfal ist offline   Mit Zitat antworten
Alt 10.07.2001, 16:04   #6
SNo0py
Inventar
 
Registriert seit: 08.02.2000
Beiträge: 1.696


Standard VB?

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.
SNo0py ist offline   Mit Zitat antworten
Alt 10.07.2001, 16:24   #7
kfal
Newbie
 
Registriert seit: 21.05.2001
Alter: 56
Beiträge: 17


Standard

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

kfal ist offline   Mit Zitat antworten
Alt 11.07.2001, 08:36   #8
SNo0py
Inventar
 
Registriert seit: 08.02.2000
Beiträge: 1.696


Standard 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... :-(
____________________________________
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.
SNo0py ist offline   Mit Zitat antworten
Alt 11.07.2001, 09:10   #9
SNo0py
Inventar
 
Registriert seit: 08.02.2000
Beiträge: 1.696


Standard

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.
SNo0py ist offline   Mit Zitat antworten
Alt 11.07.2001, 11:34   #10
Sonic
Master
 
Registriert seit: 28.03.2000
Alter: 45
Beiträge: 691


Sonic eine Nachricht über ICQ schicken
Standard

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««««««|
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
Sonic ist offline   Mit Zitat antworten
Antwort


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.

Gehe zu


Alle Zeitangaben in WEZ +2. Es ist jetzt 20:29 Uhr.


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