Parameterübergabe DLL, VCL



  • Hallo zusammen,

    <<hat sich erledigt, der Fehler steckt wohl im Compiler. Wenn mit dynamischer RTL kompiliert, dann tritt der Fehler nicht mehr auf>>

    wie realisiere ich am besten die Übergabe von Parametern in folgender Situation:

    ich habe in einer DLL mehrere Formulare.
    Aufgerufen werden diese mit folgender Funktion:

    extern "C" __declspec(dllexport) __stdcall void ActionFormShow(TTreeNode* _Node,TComponent* Owner,_TActionLists *ALs,_TActionList *AL,_TListItem *Item,HANDLE hMWnd,bool _new)
    {
    AnsiString Caption;
    int ImageIndex;
    if (_new)
    {
      //AnsiString st=_Node->Parent->Text+" "+_Node->Text;
      Item->Caption=_Node->Parent->Text+" "+_Node->Text;
      Item->ImageIndex=_Node->ImageIndex;
      Caption=_Node->Parent->Text+" "+_Node->Text;
      ImageIndex=_Node->ImageIndex;
    }else{
      Caption=Item->Caption;
      ImageIndex=Item->ImageIndex;
    }
    if (Caption=="Datei erstellen" || Caption=="Datei kopieren" || Caption=="Datei löschen" || Caption=="Datei umbenennen")
    {
      TForm_Dateiaktionen_einfach* DLLForm = new TForm_Dateiaktionen_einfach(Owner,_Node,Item,hMWnd);
      TreeForm->ImageList1->GetBitmap(ImageIndex,DLLForm->Image1->Picture->Bitmap);
      DLLForm->Caption=Caption;
      DLLForm->ShowModal();
      delete DLLForm;
    }else...
    

    die Parameter sind folgendermassen definiert:

    struct _TListItem{
       AnsiString Caption,   /**< Beschreibung des Items*/
                  Item1,     /**< String 1*/
                  Item2,     /**< String 2*/
                  Item3,     /**< String 3*/
                  EClass,    /**< Elternklasse*/
                  ECaption,  /**< ElternText*/
                  Color,     /**< Objektfarbe*/
                  Text;      /**< Objekttext*/
    
       int        Value,     /**< Integer-Wert*/
                  ImageIndex,/**< BildIndex für ListView*/
                  Index,     /**< absoluter Index*/
                  Check,     /**< Check-Status*/
                  Status,    /**< ObjektStatus???*/
                  Condition, /**< Bedingung, für Objekt*/
                  xCo,       /**< x-Koordinate für Mausposition*/
                  yCo,       /**< y-Koordinate für Mausposition*/
                  SIndex;    /**< Index für den Vergleich der Stringähnlichkeit*/
    };
    struct _TActionList{
       AnsiString Name;                /**< Name der Liste*/
       int Index;                      /**< Index der Liste*/
       std::map<int,_TListItem> Item;  /**< eindim. Feld von Items*/
    };
    typedef std::map<int,_TActionList> _TActionLists;
    

    in den einzelnen Formularen wird mit folgenden Funktionen auf die übergebenen Parameter zugegriffen:

    __fastcall TForm_Dateiaktionen_einfach::TForm_Dateiaktionen_einfach(TComponent* Owner,TTreeNode *_Node,_TListItem *_Item,HANDLE _Handle)
            : TForm(Owner)
    {
      ShowWindow(Handle,SW_HIDE);  //damit es nicht in der Taskleiste auftaucht
      Form_Dateiaktionen_einfach=this;
      Item=_Item;
      if (_Node!=NULL)
      {
        Node=_Node;
        Label3->Caption=Node->Parent->Text+" "+Node->Text;
      }else{
        Edit1->Text=Item->Item1;
        Edit2->Text=Item->Item2;
        Label3->Caption=Item->Caption;
      }
      if(Item->Caption.AnsiPos("kopieren")>0 || Item->Caption.AnsiPos("umbenennen")>0)
      {
        Label2->Visible=true;
        Edit2->Visible=true;
      }
      if(Item->Caption.AnsiPos("kopieren")>0)
      {
        Label2->Caption="Zielverzeichnis";
        Button4->Visible=true;
      }
      TabSheet1->Caption=Item->Caption;
      MainHandle=_Handle;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm_Dateiaktionen_einfach::Button1Click(TObject *Sender)
    {
    if (Edit1->Text!="" || Edit2->Text!="")
    {
      if(ExtractFilePath(Edit1->Text)!="")
      {
        Item->Caption=Label3->Caption;
        Item->Item1=Edit1->Text;
        Item->Item2=Edit2->Text;
        Close();
      }else ShowMessage("Bitte geben Sie einen Pfad an, z.B.: C:\\test\\datei.txt");
    }else ShowMessage("Bitte geben Sie einen Dateinamen an");
    }
    

    die Formulare laden und anzuzeigen stellt kein Problem dar.
    Jedoch treten beim Beenden des Programmes Fehler auf, sobald ich versuche über die Funktion Button1->Click auf die Variable "Item" zu schreiben.
    Und zwar ist das jeweils "der Vorgang read/write konnt nicht auf dem Speicher durchgeführt werden."
    Der Programmablauf funktioniert soweit korrekt. Ich kann in die Variable schreiben, und das Ergebnis auf einem ListView darstellen lassen:

    _TActionLists ActionLists;
    _TActionList actualList;
    _TListItem Item;
        Item.Caption="";
        Item.Item1="";
        Item.Item2="";
        Item.Item3="";
        Item.Color="";
        Item.Text="";
        Item.ECaption="";
        Item.EClass="";
        Item.Check=false;
        Item.ImageIndex=TreeView1->Selected->ImageIndex;
        Item.Value=-1;
        Item.Status=0;
        Item.Condition=-1;
        Item.xCo=0;
        Item.yCo=0;
        Item.SIndex=-1;
    ActionFormShow(TreeView1->Selected,Application,&ActionLists,&actualList,&Item,this->Handle,true);
    actualList.Item[actualList.Item.size()]=Item;
    ActionLists[actualList.Index]=actualList;
    

    Anscheinend vergesse ich irgendwo, Zeiger wieder zu löschen oder dergleichen.
    Ich hab mir alles mal Schritt für Schritt angeschaut, und der Fehler tritt erst auf, nachdem die Funktion Close() abgeschlossen ist, und das Application->Run() ebenfalls...
    Hat jemand eine Idee, was genau falsch ist?


Anmelden zum Antworten