DLL Meldung



  • Hallo, habe einen Fehler, den ich nicht finden kann.
    Folgendes.
    Meine Anwendung verwendet eine Dll, die ich mit dem Assistenten erstellt habe.
    Die Funktion im.- und exportier ich im C-Stil
    extern "C" __declspec(dllexport)
    {
    Funktion();
    }
    extern "C"
    {
    __declspec(dllimport)
    Funktion();
    }
    Jetzt bekomme ich hin und wieder folgende Meldung von Windows:
    "Es wurde versucht, eine nicht unterstütze Operation auszuführen."
    Komisch daran. Der Fehler wird nicht innerhalb meiner Entwicklungsumgebung gezeigt, sondern bei bestimmten Voraussetzungen.
    Am häufigsten dann, wenn die Anwendung mit ihrer DLL auf einem Server liegt und von einer workstation aufgerufen wird, dabei erfolgen Dateioperationen wiederum auf einem anderen Server.
    Innerhalb der Dll wird ein Dialog aufgerufen(das Problem hatte ich aber schon vorher)
    Es handelt sich nicht um einen Comgeschichte, sondern eine normale anwendung, die zugegebner Maßen globale Klassenvariablen verwendet(sind nicht von mir).
    Kann dies eine Konvertierungsproblem von CString auf char* sein, aber warum erscheint dann der Fehler nicht immer, denn es werden bei jedem start die gleichen Funktionen benutzt.
    Bin schon am verzweifeln und es hängt so viel davon ab, vielleicht sogar mein Job. wer kann mir dabei helfen



  • Hi

    eine Funktion exportierst du folgendermaßen:

    extern "C" [Rückgabetyp] __declspec(dllexport) [Funktionsname][Parameter]

    Also z.B.

    extern "C" int __declspec(dllexport) MeineFunktion(int i)
    {
      return i++;
    }
    

    So sollte es funktionieren.

    Grüße Rapha



  • Hallo Rapha
    natürlich du hast recht, habe in der Eile nur den Import hierein kopiert und dann den rest vergessen zu korrigieren.
    Das mache ich schon richtig, und mein Programm funktioniert sonst ja,
    aber das ist ja nicht mein Problem, sondern diese nicht unterstützte Operation.
    Das dumme daran, jetzt muss ich 1 Million Messageboxen einbauen, da ich das ganze in einer Testumgebung ablaufen lassen muss, denn aus der Entwicklungsumgebung heraus kommen diese Meldungen einfach nicht, also habe ich keinen Debugger zur Verfügung.
    Das unter Zeit und Termindruck.
    Scheiße.



  • nicht unterstützte operation hieß bei mir bisher meist exe und dll inkompatibel

    z.b. alte exe greift auf neue dll zu oder neue exe auf alte dll
    funktionen sind zwar noch gleich aber irgendwas passt halt nimmer zusammen

    ansonsten, falls du weisst welcher string/buffer probleme hat hol dir die startadresse und leg nen brakpoint auf startadresse+länge+(1-4) (falls du ned rechnen willst nimm die speicherüberwachung von vc6 ;))

    im debugmodus liegen hinter deinem buffer 4 extrazeichen auf derren existenz beim löschen geprüft wird



  • hallo Sovok,
    das alt neu Exe dll Problem hatte ich schon ausprobiert, hat sich aber nichts geändert.
    Ich werde CString wohl rausschmeißen und in TCHAR ändern, doch wundert mich einfach, dass bei gleichen Variableninhalten und keinen sonstigen Änderungen,
    es mal klappt und mal nicht, das kann doch nicht sein, wenn der Buffer immer dieselbe Größe und Inhalt hat.
    Und innerhalb meiner Enticklungsumgebung habe ich den Fehler ja nie, das ist verrückt, somit kann ich nicht debuggen.
    Das Fatale daran, die Anwendung ist schon "Draußen" nur bin ich kein Entwicklungsteam wie Microsoft und habe auch keine PR, die das ausmerzt.
    Tja, häste was gscheits glernt.



  • messageboxen würd ich nich raten...eher ne logfile
    was den buffer angeht... debug oder release?
    nur im debug modus sind die speicheradressen gleich
    ausserdem könnte das programm immernoch zufällig sicher beenden, obwohl du über irgendwelchen speicher rausgeschrieben hast... kommt ja auch drauf an was an der adresse vorher stand



  • hi,
    ja logfile ist besser, habe mich auch gerade dafür entschieden.
    es ,glaube ich und muss ich noch überprüfen,kann sein, dass im debug modus die Meldung nicht auftritt, im Release tritt sie jedenfalls auf. Und beim Kunden brauche ich ja das Release.
    Das werden wohl einpaar lange Nächte werden, wenn ich da jeden buffer überprüfen muss, aber danke jedenfalls, einen kleinen schritt bin ich weiter.
    wenn ich was außerordentliches finde dann schreibe ich das hier auch rein.



  • CMemoryState wär auch noch ne gute idee
    im debug mode wird beim löschen gesprüft, ob der buffer beschädigt is
    könnte aber auch sein dass irgendwas nich gelöscht wird



  • Hi Sovok,
    es muss tatsächlich ein Kompabtibilitätsproblem gewesen sein.
    Es reichte in meinem fall aber nicht, bei Projekt auf bereinigen klicken und alles Neu zu erstellen. Ich musste den kompletten Releaseordner löschen.
    Tja und meine Strings sind zwar noch nicht ganz sauber aber rein.
    Danke für die Hilfe 😋 👍


Anmelden zum Antworten