.dll aufrufen (von C aus)

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
schoess
Beiträge: 3
Registriert: Di Jan 15, 2013 10:23 am

.dll aufrufen (von C aus)

Beitrag von schoess » Di Jan 15, 2013 10:47 am

Guten Tag,
ich bin hier neu, wie man sicher schnell bemerkt.

Meine Frage bezieht sich auf einen .dll-Aufruf.
Wenn ich nicht falsch informiert bin, dann kann ich mit LoadLibrary, GetProcAdress etc. auf Funktionen innerhalb einer .dll zugreifen.
Was ich nicht ganz verstanden habe, ist die Typdefinition

Code: Alles auswählen

 double* (__stdcall* AFCN)(int*, double*)
ich glaube jedenfalls, dabei handelt es sich um sowas wie "Prototyping", bin aber nicht ganz sicher.

Wichtiger ist für mich aber eh:

1) Kann man grundsätzlich jede "Teilfunktion" einer .dll von einem anderen Programm aus aufrufen, oder müssen die Funktionen die zugänglich sind, explizit "exportiert" worden sein, also schon vor dem kompilieren der .dll feststehen ?

In C geschriebene .dll's exportieren explizit, wenn ich das was ich in diversen beispielen so lese richtig deute. Ich plage mich aber mit in Fortran (?) geschriebenen .dll's herum und weiss gar nicht, was da passiert.
Gibt es da einen Unterschied (ausser "CALL BY REFERENCE") ?

Ich habe nämlich schonmal versucht auf Teilfunktionen zuzugreifen, aber es gelang nicht oder es gelang, je nach Funktion.

2) Wo ist der Unterschied zwischen FUNCTION und SUBROUTINE ( in einer DLL ) aus der Sicht eines C Programms ? ( Ich weiss, die Frage poste ich mal besser im FORTRAN - Forum ... ich dachte nur... wegen der Staubschicht ... )

So, das Ganze ist erstmal vielleicht wenig konkret, aber schonmal danke fürs lesen,

Gruss,
schoess

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: .dll aufrufen (von C aus)

Beitrag von Xin » Di Jan 15, 2013 11:34 am

schoess hat geschrieben:Wenn ich nicht falsch informiert bin, dann kann ich mit LoadLibrary, GetProcAdress etc. auf Funktionen innerhalb einer .dll zugreifen.
Zu dem Thema sind wir bei google wohl inzwischen recht hoch gelistet, hm!? ;-)
schoess hat geschrieben:Was ich nicht ganz verstanden habe, ist die Typdefinition

Code: Alles auswählen

 double* (__stdcall* AFCN)(int*, double*)
ich glaube jedenfalls, dabei handelt es sich um sowas wie "Prototyping", bin aber nicht ganz sicher.
Du musst die Signatur der Funktion, die Du aus der DLL rufen willst vorher kennen.
schoess hat geschrieben:1) Kann man grundsätzlich jede "Teilfunktion" einer .dll von einem anderen Programm aus aufrufen, oder müssen die Funktionen die zugänglich sind, explizit "exportiert" worden sein, also schon vor dem kompilieren der .dll feststehen ?
Sie müssen zugänglich sein, sonst kannst Du sie nicht rufen. In Visual C++ gibt es dafür die Schlüsselwörter _dllimport und _dllexport. Was nicht von der DLL exportiert wird, kannst Du nicht rufen.
Außerdem muss das eben eine DLL sein, also eine Erweiterung zu einem Programm.
schoess hat geschrieben:In C geschriebene .dll's exportieren explizit, wenn ich das was ich in diversen beispielen so lese richtig deute. Ich plage mich aber mit in Fortran (?) geschriebenen .dll's herum und weiss gar nicht, was da passiert.
Gibt es da einen Unterschied (ausser "CALL BY REFERENCE") ?
Nicht, dass ich wüsste. Wir verwenden hier ebenfalls Fortran-Libraries und die werden einfach dazugelinkt.

Du kannst die Fortran-Libs aber ganz normal dazulinken (wenn Du die dazugehörige .lib-Datei hast). Der Umweg über LoadLibrary ist dafür nicht erforderlich.
schoess hat geschrieben:Ich habe nämlich schonmal versucht auf Teilfunktionen zuzugreifen, aber es gelang nicht oder es gelang, je nach Funktion.
Je nach Fortranversion fügt Fortran weitere Parameter für Arrays an die Funktionssignatur an. Du übergibst ja ein char ** für den String und Fortran hängt (bei neueren Compilerversionen) implizit die Länge des char-Arrays als (int*)-Parameter hinten an.
Also bekommst Du je nach Fortran-Compilerversion unterschiedliche Signaturen. Deine Signatur hat nur double und int, also keine Arrays, hier sollte die Gefahr also nicht bestehen.
schoess hat geschrieben:2) Wo ist der Unterschied zwischen FUNCTION und SUBROUTINE ( in einer DLL ) aus der Sicht eines C Programms ? ( Ich weiss, die Frage poste ich mal besser im FORTRAN - Forum ... ich dachte nur... wegen der Staubschicht ... )
Keine Ahnung, ich kenne den Unterschied auch in Fortran nicht. Ich bin kein Fortranprogrammierer. Und das ist auch gut so ;-)
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

schoess
Beiträge: 3
Registriert: Di Jan 15, 2013 10:23 am

Re: .dll aufrufen (von C aus)

Beitrag von schoess » Di Jan 15, 2013 12:19 pm

Vielen Dank,
das ging schnell.
Als Erstes einmal: Ich habe keine .lib-files.
Also kann ich nix dazulinken. Schön wäre es allemal, dazu habe ich auch "GOOGLE- OUTPUT".
Aber wenn es keinen "von aussen" sichtbaren Unterschied zwischen Fortran und anderen .dll's gibt, dann muss es jawohl kaum sein, daß ich auf alle Teile zugreifen kann, was mich schonmal beruhigt.

Den Unterschied zwischen dem Prozedere für Subroutinen und Funktionen mag es vielleicht deshalb geben, da ich keine SUBROUTINEN Aufrufe kenne, die einen Rückgabewert haben. Da wird immer ein Pointer für die Rückgabe mit übergeben.
In einer Dokumentation zu einer .dll lese ich nun von FORTRAN Funktionen, die einen Rückgabewert haben.
Deshalb könnte ich mir denken, daß sich da ein Unterschied ergibt. Ich kenne leider nicht viele Beispiele (genauer: nur eins) von Fortran -.dll's, und da werden ausschließlich NUR Subroutinen aufgerufen, wenn ich meine Doku dazu recht verstehe bzw. die nicht lügt.

Kann jemand ein Beispiel für den Aufruf einer FORTRAN Funktion aus einer .dll heraus ( ohne .lib-file, also mit LoadLibrary und GetProcAdress() ) posten? Oder einen Link? Das wäre wirklich sehr nett, ich habe nämlich leider nichts eindeutiges in dieser Richtung gefunden.
Danke jedenfalls schonmal bishierher.

Gruss,
schoess

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: .dll aufrufen (von C aus)

Beitrag von Xin » Di Jan 15, 2013 12:41 pm

schoess hat geschrieben:Als Erstes einmal: Ich habe keine .lib-files.
Dann ist die Frage, ob Du die zur Lib gehörenden Headerfiles hast, bzw. wo Du diese Lib herhast, bzw. wieso man als Entwickler mit einer Lib arbeitet, zu der man nicht die vollständigen Informationen besitzt. ^^
schoess hat geschrieben:Also kann ich nix dazulinken. Schön wäre es allemal, dazu habe ich auch "GOOGLE- OUTPUT".
Google-Output!?
schoess hat geschrieben:Den Unterschied zwischen dem Prozedere für Subroutinen und Funktionen mag es vielleicht deshalb geben, da ich keine SUBROUTINEN Aufrufe kenne, die einen Rückgabewert haben. Da wird immer ein Pointer für die Rückgabe mit übergeben.
Naja, spricht nicht wirklich für einen nennenswerten Unterschied!?
schoess hat geschrieben:In einer Dokumentation zu einer .dll lese ich nun von FORTRAN Funktionen, die einen Rückgabewert haben.
Deshalb könnte ich mir denken, daß sich da ein Unterschied ergibt. Ich kenne leider nicht viele Beispiele (genauer: nur eins) von Fortran -.dll's, und da werden ausschließlich NUR Subroutinen aufgerufen, wenn ich meine Doku dazu recht verstehe bzw. die nicht lügt.
In Fortran hat sich viel getan... nichts, was erwähnenswert wäre, aber Fortran hat ja auch auf der Lochkarte begonnen...
Es ist durchaus wahrscheinlich, dass man die Idee der Funktion, also eine Subroutine mit Rückgabe, nachträglich eingebaut hat.
schoess hat geschrieben:Kann jemand ein Beispiel für den Aufruf einer FORTRAN Funktion aus einer .dll heraus ( ohne .lib-file, also mit LoadLibrary und GetProcAdress() ) posten? Oder einen Link? Das wäre wirklich sehr nett, ich habe nämlich leider nichts eindeutiges in dieser Richtung gefunden.
Danke jedenfalls schonmal bishierher.
Auf die Schnelle kann ich Dir nur den Link hier geben: http://www.daniweb.com/software-develop ... ut-typedef#.
Da geht es um den Typedef, aber das Programm ist ja da.

Eine Subroutien, die in Fortran ein double und ein int bekommt, hat in C die Signatur

Code: Alles auswählen

void func( double * par1, int * par2 );
Entsprechend musst Du Adressen übergeben:

Code: Alles auswählen

double val1 = 1.0;
int val2 = 2;

func( &val1, &val2 );
entsprechend kannst Du sie nicht mit func( 1.0, 2 ) rufen.

Wenn Du den Typedef entsprechend anpasst, müsste das soweit gehen. Mit dem DependencyWalker kannst Du den Namen der Funktion herausfinden. Achte darauf, dass die .dll im %PATH% oder im aktuellen Verzeichnis liegt.
Viele Unsicherheiten, wo etwas schief gehen kann, aber wenn alles richtig eingestellt ist, solltest Du die Funktion ohne weitere Probleme rufen können.

Sicher, dass die DLL es wert ist, nicht in C neu geschrieben zu werden? ;-)
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

schoess
Beiträge: 3
Registriert: Di Jan 15, 2013 10:23 am

Re: .dll aufrufen (von C aus)

Beitrag von schoess » Do Jan 17, 2013 8:39 am

Naja, das entspricht genau dem, was ich für den Aufruf einer SUBROUTINE erwarte.
Wenn ich eine Funktion aufrufen versuche ich es also nach dem Schema

Code: Alles auswählen

double* func(double*, int*)
Hoffe einfach mal das klappt so. Danke dann erstmal, bei weiteren Schwierigkeiten melde ich mich bestimmt nochmal.

Gruss,
...

... ach so, die .dll kann ICH wohl nicht so einfach neuschreiben. Gilt aber erstmal so für jede .dll, die brauchbar ist. Hier ist ein Anfänger am Werk.

Antworten