dll in c erstellen

OP #2392922
Lesenswert?

Hallo Leute,

ich sitze seit ein Paar Tagen an einem komischen Problem.
Habe mit Code::Blocks eine simple cpp geschrieben und zur dll exportiert 
und die funktioniert nicht.

Hier der Code:
1
#include <stdio.h>
2

3
void runOWN(int argument) {
4

5
    FILE *fl;
6
    fl = fopen("testFileOwn.txt","a+");
7
    fprintf(fl,"%s%d","Input\r\n",argument);
8
    fclose(fl);
9

10
}

also diese Testfunktion wird von einem externene Programm aufgerufen, 
aber die Datei wird nicht erstellt.
Es gibt auch keine Fehler die angezeigt werden.

weiss jemand ewtl. woran es liegen koennte?


Danke vielmals im Voraus und viele Gruesse
Gast #2392973
Lesenswert?

> Wahrscheinlich muesste ich die
> dll mit einer anderen C-Datei linken gel_?

Ja wie hast du denn festgestellt,
daß die DLL keine Ausgabe macht ?
Dazu müsstest du sie auch starten,
also die Funktion runOWM
von einem anderen EXE Programm aus aufrufen.

> eine simple cpp

Also deine Funktion ist einfaches C,
keine Notwendigkeit ihr die Extension CPP zu geben.
OP #2392977
Lesenswert?

ja hast recht, .c macht mehr sinn :)
Es gibt ein externes Programm, (nicht von mir geschrieben) und es kann 
externe bibliotheken von C und Java aufrufen. Genau so teste ich es. Mit 
Java (jar) laefts gut, aber mit C (dll) nicht... vielleicht liegts an 
dem dll export, so mache ich das:
1
gcc -c main.cpp
2
gcc -shared -o main.dll main.o
Persönliche Seite #2393004
Lesenswert?

Michael Gromov schrieb:
> ok, also das externe programm ruft (beim Knopfruck) eine Funktion aus
> einer externen dll auf.

Und genau wie tut es das? Wie lädt es die DLL, wie ist der Name der 
Funktion in der DLL definiert?

Bedenke, daß der Name von exportierten Symbolen vom Compiler abhängt, 
C++-Funktionsnamen werden i.d.R. "dekoriert" und unterscheiden sich da 
deutlich von C.

BTW: "externe DLL" - gibt es auch interne?
Persönliche Seite #2393025
Lesenswert?

Michael Gromov schrieb:
> oh, das weiss ich leider nicht, es gibt in der doku des programms
> (SpectraSuite) nur diese Andeutung, die ich geschrieben habe,

Wie, da steht nur, daß irgendeine Funktion in der DLL aufgerufen wird, 
ohne Angabe der Aufrufkonventionen, Symbolnamen etc.?

Das ist ... drollig.

Du könntest auf jeden Fall mal versuchen, das Ding als C-Code zu 
übersetzen, denn das wird zu anderen Symbolnamen führen.
OP #2393087
Lesenswert?

ja das werde ich machen,
es koennte aber trotzdem an mir liegen - in der doku steht noch, man 
soll lieber diese funktion hier aufrufen lassen:
1
void runOWN(double * argument) { // wobei argument ein array ist
2
//hier kann man das array nutzen
3
}
und ich habe versucht dieses Array mit
1
    FILE *fl;
2
    fl = fopen("testFileOwn.txt","a+");
3
    for(int i=0; i<=sizeof(argument)/sizeof(double);i++){
4
      fprintf(fl,"%s%d","\r\nInput:",argument[i]);
5
    }
6
    fclose(fl);

in die datei zu schreiben.

Habe ich ewtl. einen Fehler dabei gemacht??
Persönliche Seite #2393109
Lesenswert?

Da hast Du gleich mehrere Fehler gemacht.

Einerseits kannst Du die Anzahl der Elemente im Array nicht so 
bestimmen:

    for(int i=0; i<=sizeof(argument)/sizeof(double);i++)

argument ist ein Pointer, sizeof davon ist 4 (auf 32-Bit-Systemen), 
sizeof von double ist 8, also wird Deine Schleife nicht sehr oft 
ausgeführt werden.

Wenn Deiner Funktion da wirklich nur ein Pointer übergeben wird, hast Du 
keine Chance, herauszufinden, wie groß die Anzahl der Elemente im Array 
sind.


Andererseits verwendest Du in fprintf den falschen Formatspezifizierer:

      fprintf(fl,"%s%d","\r\nInput:",argument[i]);

%d steht für int, nicht für double. Da müsstest Du schon %f verwenden.

Was soll die zweite Stringkonstante und das %s bewirken? Warum nicht

      fprintf(fl, "\r\nInput:%d", argument[i]);

bzw. spezifiziererkorrigiert

      fprintf(fl, "\r\nInput:%f", argument[i]);
Persönliche Seite #2393165
Lesenswert?

Michael Gromov schrieb:
> wie kann ich denn das Übergebene Array (oder Pointer zum Array)
> auslesen?

Das Auslesen geht im Prinzip schon so, wie Du es machst, da hilft der 
Welle-Teilchen-Dualismus (also der Array-Pointer-Dualismus). Das Problem 
ist nur, auf welche Art und Weise Du herausfindest, wie groß das Array 
ist, auf das dieser Pointer zeigt. Aus dem Pointer aber lässt sich diese 
Information nicht ableiten.

Wenn das das offizielle Aufrufinterface dieser Software ist, und dazu 
nichts weiter beschrieben ist, dann ist die Software Müll.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren