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.


Anmelden zum Antworten