<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Parameterübergabe DLL, VCL]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>&lt;&lt;hat sich erledigt, der Fehler steckt wohl im Compiler. Wenn mit dynamischer RTL kompiliert, dann tritt der Fehler nicht mehr auf&gt;&gt;</p>
<p>wie realisiere ich am besten die Übergabe von Parametern in folgender Situation:</p>
<p>ich habe in einer DLL mehrere Formulare.<br />
Aufgerufen werden diese mit folgender Funktion:</p>
<pre><code class="language-cpp">extern &quot;C&quot; __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-&gt;Parent-&gt;Text+&quot; &quot;+_Node-&gt;Text;
  Item-&gt;Caption=_Node-&gt;Parent-&gt;Text+&quot; &quot;+_Node-&gt;Text;
  Item-&gt;ImageIndex=_Node-&gt;ImageIndex;
  Caption=_Node-&gt;Parent-&gt;Text+&quot; &quot;+_Node-&gt;Text;
  ImageIndex=_Node-&gt;ImageIndex;
}else{
  Caption=Item-&gt;Caption;
  ImageIndex=Item-&gt;ImageIndex;
}
if (Caption==&quot;Datei erstellen&quot; || Caption==&quot;Datei kopieren&quot; || Caption==&quot;Datei löschen&quot; || Caption==&quot;Datei umbenennen&quot;)
{
  TForm_Dateiaktionen_einfach* DLLForm = new TForm_Dateiaktionen_einfach(Owner,_Node,Item,hMWnd);
  TreeForm-&gt;ImageList1-&gt;GetBitmap(ImageIndex,DLLForm-&gt;Image1-&gt;Picture-&gt;Bitmap);
  DLLForm-&gt;Caption=Caption;
  DLLForm-&gt;ShowModal();
  delete DLLForm;
}else...
</code></pre>
<p>die Parameter sind folgendermassen definiert:</p>
<pre><code class="language-cpp">struct _TListItem{
   AnsiString Caption,   /**&lt; Beschreibung des Items*/
              Item1,     /**&lt; String 1*/
              Item2,     /**&lt; String 2*/
              Item3,     /**&lt; String 3*/
              EClass,    /**&lt; Elternklasse*/
              ECaption,  /**&lt; ElternText*/
              Color,     /**&lt; Objektfarbe*/
              Text;      /**&lt; Objekttext*/

   int        Value,     /**&lt; Integer-Wert*/
              ImageIndex,/**&lt; BildIndex für ListView*/
              Index,     /**&lt; absoluter Index*/
              Check,     /**&lt; Check-Status*/
              Status,    /**&lt; ObjektStatus???*/
              Condition, /**&lt; Bedingung, für Objekt*/
              xCo,       /**&lt; x-Koordinate für Mausposition*/
              yCo,       /**&lt; y-Koordinate für Mausposition*/
              SIndex;    /**&lt; Index für den Vergleich der Stringähnlichkeit*/
};
struct _TActionList{
   AnsiString Name;                /**&lt; Name der Liste*/
   int Index;                      /**&lt; Index der Liste*/
   std::map&lt;int,_TListItem&gt; Item;  /**&lt; eindim. Feld von Items*/
};
typedef std::map&lt;int,_TActionList&gt; _TActionLists;
</code></pre>
<p>in den einzelnen Formularen wird mit folgenden Funktionen auf die übergebenen Parameter zugegriffen:</p>
<pre><code class="language-cpp">__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-&gt;Caption=Node-&gt;Parent-&gt;Text+&quot; &quot;+Node-&gt;Text;
  }else{
    Edit1-&gt;Text=Item-&gt;Item1;
    Edit2-&gt;Text=Item-&gt;Item2;
    Label3-&gt;Caption=Item-&gt;Caption;
  }
  if(Item-&gt;Caption.AnsiPos(&quot;kopieren&quot;)&gt;0 || Item-&gt;Caption.AnsiPos(&quot;umbenennen&quot;)&gt;0)
  {
    Label2-&gt;Visible=true;
    Edit2-&gt;Visible=true;
  }
  if(Item-&gt;Caption.AnsiPos(&quot;kopieren&quot;)&gt;0)
  {
    Label2-&gt;Caption=&quot;Zielverzeichnis&quot;;
    Button4-&gt;Visible=true;
  }
  TabSheet1-&gt;Caption=Item-&gt;Caption;
  MainHandle=_Handle;
}
//---------------------------------------------------------------------------
void __fastcall TForm_Dateiaktionen_einfach::Button1Click(TObject *Sender)
{
if (Edit1-&gt;Text!=&quot;&quot; || Edit2-&gt;Text!=&quot;&quot;)
{
  if(ExtractFilePath(Edit1-&gt;Text)!=&quot;&quot;)
  {
    Item-&gt;Caption=Label3-&gt;Caption;
    Item-&gt;Item1=Edit1-&gt;Text;
    Item-&gt;Item2=Edit2-&gt;Text;
    Close();
  }else ShowMessage(&quot;Bitte geben Sie einen Pfad an, z.B.: C:\\test\\datei.txt&quot;);
}else ShowMessage(&quot;Bitte geben Sie einen Dateinamen an&quot;);
}
</code></pre>
<p>die Formulare laden und anzuzeigen stellt kein Problem dar.<br />
Jedoch treten beim Beenden des Programmes Fehler auf, sobald ich versuche über die Funktion Button1-&gt;Click auf die Variable &quot;Item&quot; zu schreiben.<br />
Und zwar ist das jeweils &quot;der Vorgang read/write konnt nicht auf dem Speicher durchgeführt werden.&quot;<br />
Der Programmablauf funktioniert soweit korrekt. Ich kann in die Variable schreiben, und das Ergebnis auf einem ListView darstellen lassen:</p>
<pre><code class="language-cpp">_TActionLists ActionLists;
_TActionList actualList;
_TListItem Item;
    Item.Caption=&quot;&quot;;
    Item.Item1=&quot;&quot;;
    Item.Item2=&quot;&quot;;
    Item.Item3=&quot;&quot;;
    Item.Color=&quot;&quot;;
    Item.Text=&quot;&quot;;
    Item.ECaption=&quot;&quot;;
    Item.EClass=&quot;&quot;;
    Item.Check=false;
    Item.ImageIndex=TreeView1-&gt;Selected-&gt;ImageIndex;
    Item.Value=-1;
    Item.Status=0;
    Item.Condition=-1;
    Item.xCo=0;
    Item.yCo=0;
    Item.SIndex=-1;
ActionFormShow(TreeView1-&gt;Selected,Application,&amp;ActionLists,&amp;actualList,&amp;Item,this-&gt;Handle,true);
actualList.Item[actualList.Item.size()]=Item;
ActionLists[actualList.Index]=actualList;
</code></pre>
<p>Anscheinend vergesse ich irgendwo, Zeiger wieder zu löschen oder dergleichen.<br />
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-&gt;Run() ebenfalls...<br />
Hat jemand eine Idee, was genau falsch ist?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/99046/parameterübergabe-dll-vcl</link><generator>RSS for Node</generator><lastBuildDate>Sun, 12 Jul 2026 10:42:28 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/99046.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 25 Jan 2005 07:02:01 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Parameterübergabe DLL, VCL on Wed, 26 Jan 2005 10:09:41 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>&lt;&lt;hat sich erledigt, der Fehler steckt wohl im Compiler. Wenn mit dynamischer RTL kompiliert, dann tritt der Fehler nicht mehr auf&gt;&gt;</p>
<p>wie realisiere ich am besten die Übergabe von Parametern in folgender Situation:</p>
<p>ich habe in einer DLL mehrere Formulare.<br />
Aufgerufen werden diese mit folgender Funktion:</p>
<pre><code class="language-cpp">extern &quot;C&quot; __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-&gt;Parent-&gt;Text+&quot; &quot;+_Node-&gt;Text;
  Item-&gt;Caption=_Node-&gt;Parent-&gt;Text+&quot; &quot;+_Node-&gt;Text;
  Item-&gt;ImageIndex=_Node-&gt;ImageIndex;
  Caption=_Node-&gt;Parent-&gt;Text+&quot; &quot;+_Node-&gt;Text;
  ImageIndex=_Node-&gt;ImageIndex;
}else{
  Caption=Item-&gt;Caption;
  ImageIndex=Item-&gt;ImageIndex;
}
if (Caption==&quot;Datei erstellen&quot; || Caption==&quot;Datei kopieren&quot; || Caption==&quot;Datei löschen&quot; || Caption==&quot;Datei umbenennen&quot;)
{
  TForm_Dateiaktionen_einfach* DLLForm = new TForm_Dateiaktionen_einfach(Owner,_Node,Item,hMWnd);
  TreeForm-&gt;ImageList1-&gt;GetBitmap(ImageIndex,DLLForm-&gt;Image1-&gt;Picture-&gt;Bitmap);
  DLLForm-&gt;Caption=Caption;
  DLLForm-&gt;ShowModal();
  delete DLLForm;
}else...
</code></pre>
<p>die Parameter sind folgendermassen definiert:</p>
<pre><code class="language-cpp">struct _TListItem{
   AnsiString Caption,   /**&lt; Beschreibung des Items*/
              Item1,     /**&lt; String 1*/
              Item2,     /**&lt; String 2*/
              Item3,     /**&lt; String 3*/
              EClass,    /**&lt; Elternklasse*/
              ECaption,  /**&lt; ElternText*/
              Color,     /**&lt; Objektfarbe*/
              Text;      /**&lt; Objekttext*/

   int        Value,     /**&lt; Integer-Wert*/
              ImageIndex,/**&lt; BildIndex für ListView*/
              Index,     /**&lt; absoluter Index*/
              Check,     /**&lt; Check-Status*/
              Status,    /**&lt; ObjektStatus???*/
              Condition, /**&lt; Bedingung, für Objekt*/
              xCo,       /**&lt; x-Koordinate für Mausposition*/
              yCo,       /**&lt; y-Koordinate für Mausposition*/
              SIndex;    /**&lt; Index für den Vergleich der Stringähnlichkeit*/
};
struct _TActionList{
   AnsiString Name;                /**&lt; Name der Liste*/
   int Index;                      /**&lt; Index der Liste*/
   std::map&lt;int,_TListItem&gt; Item;  /**&lt; eindim. Feld von Items*/
};
typedef std::map&lt;int,_TActionList&gt; _TActionLists;
</code></pre>
<p>in den einzelnen Formularen wird mit folgenden Funktionen auf die übergebenen Parameter zugegriffen:</p>
<pre><code class="language-cpp">__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-&gt;Caption=Node-&gt;Parent-&gt;Text+&quot; &quot;+Node-&gt;Text;
  }else{
    Edit1-&gt;Text=Item-&gt;Item1;
    Edit2-&gt;Text=Item-&gt;Item2;
    Label3-&gt;Caption=Item-&gt;Caption;
  }
  if(Item-&gt;Caption.AnsiPos(&quot;kopieren&quot;)&gt;0 || Item-&gt;Caption.AnsiPos(&quot;umbenennen&quot;)&gt;0)
  {
    Label2-&gt;Visible=true;
    Edit2-&gt;Visible=true;
  }
  if(Item-&gt;Caption.AnsiPos(&quot;kopieren&quot;)&gt;0)
  {
    Label2-&gt;Caption=&quot;Zielverzeichnis&quot;;
    Button4-&gt;Visible=true;
  }
  TabSheet1-&gt;Caption=Item-&gt;Caption;
  MainHandle=_Handle;
}
//---------------------------------------------------------------------------
void __fastcall TForm_Dateiaktionen_einfach::Button1Click(TObject *Sender)
{
if (Edit1-&gt;Text!=&quot;&quot; || Edit2-&gt;Text!=&quot;&quot;)
{
  if(ExtractFilePath(Edit1-&gt;Text)!=&quot;&quot;)
  {
    Item-&gt;Caption=Label3-&gt;Caption;
    Item-&gt;Item1=Edit1-&gt;Text;
    Item-&gt;Item2=Edit2-&gt;Text;
    Close();
  }else ShowMessage(&quot;Bitte geben Sie einen Pfad an, z.B.: C:\\test\\datei.txt&quot;);
}else ShowMessage(&quot;Bitte geben Sie einen Dateinamen an&quot;);
}
</code></pre>
<p>die Formulare laden und anzuzeigen stellt kein Problem dar.<br />
Jedoch treten beim Beenden des Programmes Fehler auf, sobald ich versuche über die Funktion Button1-&gt;Click auf die Variable &quot;Item&quot; zu schreiben.<br />
Und zwar ist das jeweils &quot;der Vorgang read/write konnt nicht auf dem Speicher durchgeführt werden.&quot;<br />
Der Programmablauf funktioniert soweit korrekt. Ich kann in die Variable schreiben, und das Ergebnis auf einem ListView darstellen lassen:</p>
<pre><code class="language-cpp">_TActionLists ActionLists;
_TActionList actualList;
_TListItem Item;
    Item.Caption=&quot;&quot;;
    Item.Item1=&quot;&quot;;
    Item.Item2=&quot;&quot;;
    Item.Item3=&quot;&quot;;
    Item.Color=&quot;&quot;;
    Item.Text=&quot;&quot;;
    Item.ECaption=&quot;&quot;;
    Item.EClass=&quot;&quot;;
    Item.Check=false;
    Item.ImageIndex=TreeView1-&gt;Selected-&gt;ImageIndex;
    Item.Value=-1;
    Item.Status=0;
    Item.Condition=-1;
    Item.xCo=0;
    Item.yCo=0;
    Item.SIndex=-1;
ActionFormShow(TreeView1-&gt;Selected,Application,&amp;ActionLists,&amp;actualList,&amp;Item,this-&gt;Handle,true);
actualList.Item[actualList.Item.size()]=Item;
ActionLists[actualList.Index]=actualList;
</code></pre>
<p>Anscheinend vergesse ich irgendwo, Zeiger wieder zu löschen oder dergleichen.<br />
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-&gt;Run() ebenfalls...<br />
Hat jemand eine Idee, was genau falsch ist?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/705213</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/705213</guid><dc:creator><![CDATA[Sven_S]]></dc:creator><pubDate>Wed, 26 Jan 2005 10:09:41 GMT</pubDate></item></channel></rss>