Forum: Compiler & IDEs dll in c erstellen


von Michael G. (moska)


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

von Peter II (Gast)


Lesenswert?

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?

von Michael G. (moska)


Lesenswert?

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...

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Na, dann ist vielleicht Dein Versuch, die DLL zu nutzen, nicht 
erfolgreich.

Hast Du denn schon mal einen Debugger bemüht?

von Michael G. (moska)


Lesenswert?

ja, aber wie soll ich eine dll debugen? Wahrscheinlich muesste ich die 
dll mit einer anderen C-Datei linken gel_?

von Peter II (Gast)


Lesenswert?

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.

von MaWin (Gast)


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.

von Michael G. (moska)


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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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?

von Michael G. (moska)


Lesenswert?

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...

von Rufus Τ. F. (rufus) Benutzerseite


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?

von Michael G. (moska)


Lesenswert?

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.

von Rufus Τ. F. (rufus) Benutzerseite


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.

von Michael G. (moska)


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??

von Rufus Τ. F. (rufus) Benutzerseite


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]);

von Michael G. (moska)


Lesenswert?

uuuppppps... das sind echt viele fehler,
wie kann ich denn das Übergebene Array (oder Pointer zum Array) 
auslesen?

von Rufus Τ. F. (rufus) Benutzerseite


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.

von Michael G. (moska)


Lesenswert?

ähm, ich glaub die länge ist konstant, also die kenne ich.

von Michael G. (moska)


Lesenswert?

.. ich meine die arrays die heir übergeben werden, haben eine feste, 
bereits bekannte länge

von Uwe (Gast)


Lesenswert?

Wenn ein Java Programmierer sich mit C beschäftigt ...

von Michael G. (moska)


Lesenswert?

ah komm schon, sich lüstig machen kann jeder,
aber ich würde mich eher über hilfe freuen :)

von Michael G. (moska)


Lesenswert?

ok, es hat geklappt, danke vielmals an alle!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.