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
voidrunOWN(intargument){
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
Michael Gromov schrieb:> aber die Datei wird nicht erstellt.
sicher? Kann es sein das sie in einem Anderen Verzeichniss erzeugt
wird?. Auserdem gibt es doch einen Debugger warum nutzt du ihn nicht?
ich habe das in exe und dll exportiert, wenn ich die exe ausfuehre (habe
die main methode auch hinzugefuegt) dann wird die txt-datei erstellt.
Also gibts auch keine Fehler.
Aber als dll funktionerts nicht. Habe die ganze festplatte durchsucht...
Michael Gromov schrieb:> ja, aber wie soll ich eine dll debugen? Wahrscheinlich muesste ich die> dll mit einer anderen C-Datei linken gel_?
eigentlich nicht, es so so geht wie du auch normalen code debugs. Ich
kenne aber Code::Blocks nicht.
Du könntest ja mal eine Fehlerbehandlung in der dll einbauen.
> 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.
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:
Michael Gromov schrieb:> Es gibt ein externes Programm, (nicht von mir geschrieben) und es kann> externe bibliotheken von C und Java aufrufen.
Da dürfte ein ganz massives Verständnisproblem vorliegen.
Was genau macht das "externe Programm" und was soll, nach Deutung
dieses Programmes, eine "externe Bibliothek" sein?
ok, also das externe programm ruft (beim Knopfruck) eine Funktion aus
einer externen dll auf. .... so und mit JAVA (jar) klappts auch.
mit der dll nicht...
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?
oh, das weiss ich leider nicht, es gibt in der doku des programms
(SpectraSuite) nur diese Andeutung, die ich geschrieben habe, ich werde
mal eine email an die hersteller verfassen und fragen, wie genau diese
dlls aufgerufen werden.
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.
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]);
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.