DLL in C



  • Hallo Leute,

    ich habe eine DLL die Funktionen beinhaltet die ich nun mit C aufrufen will
    giebt es dort irgendeine Möglichkeit?

    Liebe Grüße
    sven



  • Bitte überdenke die Fragestellung in Zukunft...

    Wenn Dir die DLL nicht bekannt ist, bzw. wenn nicht bekannt ist was für Funktionen sie exportiert kannst Du sie zbsp. mit DUMPBIN untersuchen.

    http://msdn.microsoft.com/de-de/library/c1h23y6c(v=vs.90).aspx



  • Ich habe folgendes beispiel und will die Funktionen jetzt halt in C anstatt in Delphi nutzen.

    Delphi Bsp.:

    // Delphi Beispiel, um die DMX510.DLL anzusteuern
    // Achtung: die Datei MPUSBAPI.DLL muss sich im gleichen Verzeichnis wie die DMX510.DLL befinden
    
    unit test1; //
    
    interface
    
    uses
      Windows, Messages, SysUtils, Classes, Controls, Forms, Dialogs,
      StdCtrls, ComCtrls, ExtCtrls;
    
    // in der dazugehörigen Form müssen folgende Objekte erstellt werden:
    // Textfenster Edit1 (TEdit) für den DMX-Wert
    // Textfenster Edit2 (TEdit) für Versionsanzeige
    // Einen Timer Timer1(TTimer) zur Aktualisierung der DMX-Werte, Intervall=25ms
    // Fünf Trackbars,TrackBar1-TrackBar5 (TTrackBar) als Schiebepotis für fünf Kanäle
    //  Eigenschaften der Trackbars: Min=0; Max=255; LineSize=1; Frequency=5
    // Einen Befehlsbutton Button1 (TButton) um die Version (Namen) aus der DLL zu holen
    // Einen Befehlsbutton Button2 (TButton) um  die Anwendung zu beenden
    type
      TForm1 = class(TForm)
        Edit1: TEdit;
        Button1: TButton;
        Button2: TButton;
        Edit2: TEdit;
        TrackBar1: TTrackBar;
        Timer1: TTimer;
        TrackBar2: TTrackBar;
        TrackBar3: TTrackBar;
        TrackBar4: TTrackBar;
        TrackBar5: TTrackBar;
        procedure Button2Click(Sender: TObject);
    
        procedure Button1Click(Sender: TObject);
        procedure TrackBar1Change(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure Timer1Timer(Sender: TObject);
    
      private
        { Private-Deklarationen }
      public
        { Public-Deklarationen }
       n:integer;
       i:integer;
      end;
    
    var
      Form1: TForm1;
      dmxout:array of byte; // für alle 510 DMX-Kanäle
    
    implementation
    
    {$R *.DFM}
    
    // hier die nötigen DLL-Deklarationen:
    function GetDMXInterface: pchar; stdcall; external 'DMX510.dll';
    function SetLevel(a: array of byte): boolean; stdcall; external 'DMX510.dll';
    function GetMaxChannels: integer; external 'DMX510.dll';
    
    procedure TForm1.Button2Click(Sender: TObject);
    begin
     application.Terminate ;
    end;
    
    procedure TForm1.Button1Click(Sender: TObject);
    var s:integer;
    st:shortstring;
    begin
    //s:=GetMaxChannels;
    st :=GetDMXInterface;
    //edit1.Text :=inttostr(s);
    edit1.Text :=st;
    end;
    
    procedure TForm1.TrackBar1Change(Sender: TObject);
    begin
     edit2.text:=inttostr(trackbar1.position); // DMX-Wert 0-255 wird angezeigt
    end;
    
    procedure TForm1.FormCreate(Sender: TObject);
    var m:integer;
    begin
    SetLength(dmxout,510);  // Länge des Arrays festlegen
     for m:=0 to HIGH(dmxout) do
      begin
       dmxout[m]:=0; //alle Kanäle initialisieren
      end;
     i:=1;
     n:=0;
    end;
    
    procedure TForm1.Timer1Timer(Sender: TObject); // wird alle 25ms aufgerufen
    var
        ok:boolean;
    begin
    // um Kanäle 3 und 4 automatisch zu inkrementieren und dekrementieren
    // müssen die nachfolgenden Doppel-Schrägstriche entfernt werden
    
    //n:=n+i;
    //if n<0 then n:=0;
    //if n=0 then i:=1;
    //if n=255 then i:=-1;
    //if n>255 then n:=0;
    
       dmxout[0]:=trackbar1.position;
       dmxout[1]:=trackbar2.position;
       dmxout[2]:=trackbar3.position;
       dmxout[3]:=trackbar4.position;
       dmxout[4]:=trackbar5.position;
    
    //   dmxout[3]:=n;
    //   dmxout[4]:=n;
       //dmxout[255]:=trackbar5.position;  // Beispiel für einen höheren Kanal
       ok:=SetLevel(dmxout);  // Ausgaberoutine aufrufen
       if ok= false then showmessage('USB Error');
    end;
    
    end.
    


  • Diese Frage gehört in das Subforum WinAPI.



  • Denn bitte verschieben 🙂



  • Dieser Thread wurde von Moderator/in rüdiger aus dem Forum C (C89 und C99) in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • So hier wer ne Idee?



  • Wenn Du keine LIB und -Datei hast, dann musst Du die Funktionen mittels "LoadLibrary" und "GetProcAddress" _einbinden_.

    Z.B. so:

    typedef char* (WINAPI *PGetDMXInterface)();
    
       PGetDMXInterface pGetDMXInterface;
    
       pGetDMXInterface= (PGetDMXInterface ) GetProcAddress(
          LoadLibrary(TEXT("'DMX510.dll")), 
          "GetDMXInterface");
       if(NULL != pGetDMXInterface)
       {
          char* str = pGetDMXInterface();
       }
    


  • Ich kenne mich mit Delphi nicht aus. Die Frage ist bei WinApi gelandet, also ist es eine Windows-Anwendung. Hier brauchen DLLs einen Einstieg über eine Funktion DllMain(). Diese kann bei Borland BOOL APIENTRY DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved) heissen. Ist diese Einstiegsfunktion vorhanden?



  • berniebutt schrieb:

    Hier brauchen DLLs einen Einstieg über eine Funktion DllMain().

    Na, dann lass sie mal weg und teste, was passiert.



  • berniebutt schrieb:

    ...

    Ich glaube Du hast die Frage nicht verstanden, oder?



  • svenbow schrieb:

    Hallo Leute,

    ich habe eine DLL die Funktionen beinhaltet die ich nun mit C aufrufen will
    giebt es dort irgendeine Möglichkeit?

    Liebe Grüße
    sven

    Du musst Dir zu der DLL eine Headerdatei basteln mit den entsprechenden Prototypen, sowie die LIB-Datei zum Einbinden.

    Dazu musst Du wissen wie DELPHI intern die einzelnen Variablen und Methoden ablegt, das ist keineswegs trivial. Hier stellt sich die Frage nach Sinn, Nutzen und Aufwand...

    Könntest Du C++ benutzen, kann man mWn die C++-Dateien von Delphi erstellen lassen (Linker Options, "Generate C++ object files", "Export all symbols" und "Include namespaces"), die Du aber nur mit den C++Builder nutzen kannst.

    Ciao MM


Log in to reply