Struct an DLL übergeben funktioniert nicht



  • Hallo Community!
    (Microsoft Visual Studio 2005)
    Ich rufe aus meinem Programm eine Funktion mit einigen Parametern aus meiner DLL auf. Das funktioniert soweit sehr gut. Die bisherigen Parameter waren Form, String & int. Nun fehlt noch ein Parameter. Der ist eine selbstdefinierte Struktur:

    typedef struct                                         
     {
      unsigned int  a,b,c,d,e;
      double z;
     } TEST_Type;
    

    Sobald ich diesen in die Parameterübergabe der DLL und in den Funktionsaufruf schreibe, wird die DLL kompiliert das Programm liefert mir aber beim kompilieren den Fehler:

    Fehler 1 error C3767: "dll_2::Class1::NForm": Auf mögliche Funktion(en) kann nicht zugegriffen werden.

    Wie übergebe ich also eine Struktur an eine DLL bzw. was mache ich falsch?
    Mich wundert nur das es davor, also ohne die Übergabe der Struktur schon einwandfrei lief. 😕 Deshalb nehme ich an, dass es an der Übergabe der Struktur liegt.
    Die dll habe ich nur über die Projekt-Einstellungen unter Verweise hinzugefügt. Die Autovervollständigung klappt auch, also nehme ich dann das ich sie richtig eingebunden habe.

    DLL:

    #include "stru.h"
    
    namespace dll_2 {
    
    	public ref class Class1
    	{
    		public:
    		static int NForm(Form^ dparent, String^ _FileName, int _No,  TEST_Type* DOpt);
    
    	};
    }
    

    Funktionsaufruf:

    dll_2::Class1::NForm( dparent , _FileName, _No, dparent->DOpt);
    


  • Ist die Struktur vorgegeben?
    Ansonsten empfehle ich auch die Sprachmittel zu benutzen (z.B. einen ValueType).
    Simon



  • Ersteinmal danke für deine Antwort.
    Und ja die Struktur ist vorgegeben.

    Aber ich mein, dass ist doch was relativ prinzipielles. Ich frag mich warum es nicht geht.



  • Ist dparent->DOpt wirklich ein TEST_Type* ?
    Simon



  • Wie kompilierst Du Dll und Applikation?
    clr:safe, clr:pure oder clr?



  • simon.gysi schrieb:

    Ist dparent->DOpt wirklich ein TEST_Type* ?
    Simon

    Ja

    taraneas schrieb:

    Wie kompilierst Du Dll und Applikation?
    clr:safe, clr:pure oder clr?

    Dll: /clr
    App: /clr:pure

    Müsst ich das abändern ?



  • Nein, das passt.



  • Schau dir mal die Beschreibung zu diesem Compilerfehler an.

    Es hat anscheinend nichts mit der Struktur zu tun, sondern mit dem Geltungsbereich des Aufrufs.



  • Naja aber sobald ich die Struktur bei der Parameterübergabe wegglasse funktioniert es ja - oder verstehe ich dich falsch ?

    Deswegen dürfte es ja am Geltungsbereich nicht liegen..Ich dachte zunächst würde es vielleicht mit

    typedef public struct { ...
    

    gehen - aber auch da kommt die gleiche Fehlermeldung



  • Stell doch mal ein Minimalbeispiel als Projekt bereit.



  • So ich habe nun mal ein Minimalbeispiel erzeugt:
    - es sind 2 Projekte:
    a) Aufruf DLL: Die Anwendung die die Dll aufruft - der Funktionsaufruf ist in der Form.h ganz unten
    -> gegebenenfalls müsst ihr noch unter Projekteigenschaften das Verzeichnis der "teststukt.h" anfügen - diese liegt in dem Struk DLL-Ordner

    b) Struk DLL: Die DLL- der eine Struktur übergeben werden soll

    Projekte im RAR-Format gepackt gibts hier:
    http://netload.in/datei46eb23accf1b5151a9f9ee2468a0bfb2/struct_an_dll.rar.htm

    Vielen Dank - für eure Mühe!



  • Ein paar Tipps:

    -Schreib lieber ein kleines exemplarisches Programm, das deinen Fehler verdeutlicht, im Quellcode mit CodeTags hier ins Forum (meistens führt das Zusammenfassenfassen des Problems schon hin zur Lösung).
    -Es werden sich mit Sicherheit nicht viele Forenmitglieder durch die vielen Links mit den tausenden von Werbungen durchklicken, um zu deinem Quellcode zu kommen.
    -Nimm keine namespaces mit in den Header auf, sondern schreib im Header den kompletten Namen aus. Ist hilfreich bei größeren Projekten. So werden nicht durch das viele Includieren zusätzliche Namespaces hinzugenommen.
    -using namespace in der Cpp-Datei verwenden.
    -Klassennamen ausschreiben mit einem Namen, der die Eingenschaften der Klasse zeigt, damit keine Verwechslung auftreten kann.



  • Hallo, ich habe gerade das gleiche Problem!
    Ist es mittlerweile gelöst worden?



  • WAS für ein Problem?
    Hier wurde bisher noch keines gezeigt...



  • Doch sicher, das von Thurstan aus dem ersten Post. Ich kann ebenfalls kein struct an eine DLL übergeben, mit dem Fehler C3767.


Log in to reply