Problem bei der Erstellung einer DLL

nitgun

Mitglied
moin, moin,

ich versuche gerade in MathCAD 13 mit Hilfe einer DLL eine eigene Funktion einzubinden. Das funktioniert prinzipiell und ich habe das Interface(darunter verstehe ich jetzt, welche Funktionen wie im Quellcode zu verwenden sind, damit MathCAD damit etwas anfangen kann) dazu auch weitestgehend verstanden.
Als Compiler verwende ich Dev-C++ (das verwendet wiederum g++). Dsa produziert mir auch fehlerfrei eine DLL. Wenn ich diese aber nun in MathCAD verwende, ist meine Funktion nicht registriert. Bis jetzt könnte es ja noch an mir liegen ;-)
Ich habe aber eine funktionierende DLL und den Quelltext dazu von jemandem bekommen. Wenn ich diese DLL einbinde, funktioniert es. Wenn ich den dazugehörigen Quelltext mit Dev-C++ übersetze und diese DLL einbinde, geht es nicht mehr.
Hat evtl. jemand eine Idee, woran das liegen kann und wie ich Dev-C++ dazu bewege, mir eine DLL zu produzieren, die ich verwenden kann? Die funktionierende DLL wurde übrigens mit Open WATCOM übersetzt, allerdings kann ich mich damit irgendwie nicht anfreunden.
Vielen Dank für eure Hilfe.

mfg

nitgun
 
Hi.

Ohne jetzt (zumindest auszugsweise) den Quelltext zu sehen, kann wohl kaum jemand eine treffende Antwort geben.

Gruß
 
Wie ich bereits geschrieben habe, wird der gleiche Quelltext von den Compilern unterschiedlich übersetzt. Ich habe jetzt noch eine dritte Version mit VisualC++ 2005 erstellt. Diese führt dazu, dass MathCAD gar nicht mehr startet.
Hier aber doch mal noch der Quelltext. Vielleicht sind meine Gedankengänge ja auch verkehrt:
Code:
#include "MCADINCL.h"                           //enthält die windows.h

#define  MUST_BE_REAL           1
#define  MUST_BE_POSITIVE       2
#define  NUMBER_OF_ERRORS       2

// table of error messages
char * myErrorMessageTable[NUMBER_OF_ERRORS] =
    {   "must be real",
        "must be positive",
    };
    
//Funktionsprototyp
LRESULT waitfunction(LPCOMPLEXSCALAR ergebnis, LPCCOMPLEXSCALAR zeit);

//FUNCTIONINFO-Struktur mit den Informationen, um die Funktion in MathCAD zu registrieren
FUNCTIONINFO wait={
             "wait",                           //Name der Funktion in MathCAD
             "time",                           //Aufruf der Funktion in der Form sleep(time)
             "wartet angegebene Zeit in ms",   //Beschreibung der Funktion
             (LPCFUNCTION)waitfunction,        //Pointer auf auszuführende C++-Funktion
             COMPLEX_SCALAR,                   //Rückgabewert der Funktion
             1,                                //ein Argument
             {COMPLEX_SCALAR}                  //vom Typ COMPLEX_SCALAR
             };

//Einstiegspunkt in die DLL
BOOL APIENTRY DllMain (HINSTANCE hInst     /* Library instance handle. */ ,
                       DWORD reason        /* Reason this function is being called. */ ,
                       LPVOID reserved     /* Not used. */ )
{
    switch (reason)
    {
      case DLL_PROCESS_ATTACH:
           //registriert Fehlermeldungen und wenn dies erfolgreich war, die Funktion selbst
           //if ( CreateUserErrorMessageTable(hInst, NUMBER_OF_ERRORS, myErrorMessageTable ) )
              CreateUserFunction( hInst, &wait );
              CreateUserErrorMessageTable(hInst, NUMBER_OF_ERRORS, myErrorMessageTable);
         

        break;

      case DLL_PROCESS_DETACH:
        break;

      case DLL_THREAD_ATTACH:
              CreateUserFunction( hInst, &wait );
              CreateUserErrorMessageTable(hInst, NUMBER_OF_ERRORS, myErrorMessageTable);
             

        break;

      case DLL_THREAD_DETACH:
        break;
    }

    /* Returns TRUE on success, FALSE on failure */
    return TRUE;
}

//Definition der Funktion "wartenfunction"
LRESULT waitfunction(LPCOMPLEXSCALAR ergebnis, LPCCOMPLEXSCALAR zeit)
{
        if (zeit->imag!=0) return MAKELRESULT(MUST_BE_REAL,1);
        long time=zeit->real;
        if (time<0) return MUST_BE_POSITIVE;
        Sleep(time);
        ergebnis->real=time;
        return 0;
}

Die MCADINCL.h ist eine bei MathCAD mitgelieferte Headerdatei. In der Datei wiederum wird die windows.h benutzt, sodass ich die nicht nochmal explizit mit eingebunden habe. Zusätzlich gibt es dann noch eine Library MCADUSER.lib, die ich über die Parameter (Add Library or Object im entsprechenden Dialog) in Dev-C++ eingebunden habe.

Bei dem Test mit Visual ist mir noch etwas anderes aufgefallen. Ich hatte testweise in meinem Quelltext ein AllocConsole() bei DLL_THREAD_ATTACH um zu probieren, ob etwas passiert. Bei Dev-C++ wurde das ignoriert. Bei Visual wird kurzzeitig eine Konsole geöffnet, aber auch gleich wieder geschlossen. Aber MathCAD startet gar nicht.

Schönen Abend noch.

nitgun
 
Zuletzt bearbeitet:
Also das "Extern C" hat nicht geholfen. Mit dem C oder C++ bin ich mir nicht so ganz sicher, da ich noch nicht richtig sattelfest bin und daher die Unterschiede noch nicht so ausmachen kann.
Bei dem zweiten Link, wird die DLL ja mit Hilfe von g++ erstellt. Bei meinem Dev-C++ wird das ganze mit Hilfe von dllwrap gemacht. Ich werde jetzt mal versuchen, den davon zu überzeugen, dass mit g++ zu machen.
Vielen Dank schon mal für die Hinweise.

mfg

nitgun
 
Ich habe jetzt das makefile so angepasst, dass statt dllwrap g++ -shared verwendet wurde. Er hat mir auch eine DLL erzeugt, aber leider funktioniert sie genauso wenig in MathCAD, wie die anderen. So langsam nervt mich das. Ich werde wohl bei Gelegenheit doch nochmal OpenWATCOM ausprobieren müssen, ob ich es damit hin bekomme. Vielleicht mache ich ja auch einen grundlegenden Fehler.

mfg

nitgun
 
Mit OpenWATCOM bekomme ich es derzeit gar nicht compiliert. Über die Kommandozeile bricht er damit ab, dass er sagt, dass er die betreffende Datei nicht lesen kann. Über die mitgeliferten IDE bekomme ich die Fehlermeldung, dass der letzte Aufruf ein bad status lieferte. Irgendwie nervt mich das gerade sehr. Bis jetzt musste ich mich bei meinem Programmiergestümper nur um inhaltliche Fehler kümmern und nicht noch einen Compiler suchen, der das so übersetzt, dass auch das rauskommt, was rauskommen soll. Wobei ich aber derzeit noch nicht ganz ausschließen will, dass es nicht doch an mir liegt.

mfg

nitgun
 
Zurück