Erstellen einer DLL eines C Modules
-
Ich vewrsuche gerade eine DLL eines C Moduls zu erstellen.
#include <windows.h> //--------------------------------------------------------------------------- // Wichtiger Hinweis über die DLL-Speicherverwaltung, falls die DLL die statische // Version der Laufzeitbibliothek (RTL) verwendet: // // Wenn die DLL Funktionen exportiert, die String-Objekte (oder Strukturen/ // Klassen, die verschachtelte Strings enthalten) als Parameter oder Funktionsergebnisse übergibt, // muß die Bibliothek MEMMGR.LIB im DLL-Projekt und anderen Projekten, // die die DLL verwenden, vorhanden sein. Sie benötigen MEMMGR.LIB auch dann, // wenn andere Projekte, die die DLL verwenden, new- oder delete-Operationen // auf Klassen anwenden, die nicht von TObject abgeleitet sind und die aus der DLL exportiert // werden. Durch das Hinzufügen von MEMMGR.LIB wird die DLL und deren aufrufende EXEs // angewiesen, BORLNDMM.DLL als Speicherverwaltung zu benutzen. In diesem Fall // sollte die Datei BORLNDMM.DLL zusammen mit der DLL weitergegeben werden. // // Um die Verwendung von BORLNDMM.DLL, zu vermeiden, solten String-Informationen als "char *" oder // ShortString-Parameter weitergegeben werden. // // Falls die DLL die dynamische Version der RTL verwendet, müssen Sie // MEMMGR.LIB nicht explizit angeben. //--------------------------------------------------------------------------- #pragma argsused int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved) { return 1; }Soweit bin ich, wie geht es weiter.
Ich möchte eine Funktion "unsigned int Test(unsigned int Cnt) zufügen"
wie gehe ich da vor?
-
-
Hallo,
habe nun mal folgendes probiert.
Die DLL
#pragma argsused BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fwdreason, LPVOID lpvReserved) { return 1; } //--------------------------------------------------------------------------- __declspec (dllexport) int Test(int Cnt) { Cnt++; return Cnt; }Meine Anwendung
typedef int (__stdcall *Test)(int Cnt); Test _Test; HINSTANCE DllHandle; TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { DllHandle = LoadLibrary("dll_.dll"); if(Handle == NULL) { Application->MessageBox("can not load DLL","error",MB_ICONSTOP); } else { _Test = (Test) GetProcAddress(DllHandle, "_Test"); if(_Test == NULL)Application->MessageBox("DLL Error","error",MB_ICONSTOP); } Cnt = 0; } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { Cnt = _Test(Cnt); Edit1->Text = Cnt; }Funkt soweit, aber lasse ich in Button1Click das Edit1->Text = Cnt weg
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Cnt = _Test(Cnt);
}
gibt es beim Rücksprung eine Zugriffsverletzung.