<?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[DLL Codeguard RessourceLeak]]></title><description><![CDATA[<p>Hallo zusammen</p>
<p>Ich habe eine DLL erstellt, welche ich dynamisch in ein Projekt eingebunden habe.<br />
Soweit so gut. Sobald ich jedoch die Funktion aus der DLL ausführe und denn Speicher der DLL freigebe (FreeLibrary), zeigt mir CodeGuard ein RessourceLeak an.</p>
<pre><code class="language-cpp">Error 00049. 0x300010 (Thread 0x08E4):
Resource leak: The memory block (0x1254C74) was never freed

The memory block (0x01254C74) [size: 36 bytes] was allocated with SysGetMem
Call Tree:
   0x014C10B3
   0x3267E2F5(=CC3260MT.DLL:0x01:07D2F5)
   0x3267E813(=CC3260MT.DLL:0x01:07D813)
   0x014A134C
   0x7C92CBAB(=ntdll.dll:0x01:01BBAB)
   0x7C926178(=ntdll.dll:0x01:015178)
...
</code></pre>
<p>Ich kann leider mit der Meldung nicht viel Anfangen.<br />
Die Funktion in der DLL bekommt als Parameter zwei Pointer(char und int). Der Fehler tritt selbst dann auf wenn ich alles in der Funktion auskommentiere.<br />
Ich weiß langsamm nicht mehr weiter, wie ich den Fehler einkreisen kann.<br />
Zu Erstellung der DLL habe ich das BCB Builder Tutorial verwendet.<br />
Habe die memmgr.lib eingebunden, brauch ich die überhaupt? Verwende keine dynamisch RTL.<br />
Ich hab noch was von Aufrufkonventionen gelesen, jedoch weiß nicht so recht etwas damit anzufangen.</p>
<p>Ich hoffe es kann mir jemand helfen.</p>
<p>MfG Stephan</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/147765/dll-codeguard-ressourceleak</link><generator>RSS for Node</generator><lastBuildDate>Thu, 06 Aug 2026 07:05:41 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/147765.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 19 May 2006 17:54:10 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to DLL Codeguard RessourceLeak on Fri, 19 May 2006 17:54:10 GMT]]></title><description><![CDATA[<p>Hallo zusammen</p>
<p>Ich habe eine DLL erstellt, welche ich dynamisch in ein Projekt eingebunden habe.<br />
Soweit so gut. Sobald ich jedoch die Funktion aus der DLL ausführe und denn Speicher der DLL freigebe (FreeLibrary), zeigt mir CodeGuard ein RessourceLeak an.</p>
<pre><code class="language-cpp">Error 00049. 0x300010 (Thread 0x08E4):
Resource leak: The memory block (0x1254C74) was never freed

The memory block (0x01254C74) [size: 36 bytes] was allocated with SysGetMem
Call Tree:
   0x014C10B3
   0x3267E2F5(=CC3260MT.DLL:0x01:07D2F5)
   0x3267E813(=CC3260MT.DLL:0x01:07D813)
   0x014A134C
   0x7C92CBAB(=ntdll.dll:0x01:01BBAB)
   0x7C926178(=ntdll.dll:0x01:015178)
...
</code></pre>
<p>Ich kann leider mit der Meldung nicht viel Anfangen.<br />
Die Funktion in der DLL bekommt als Parameter zwei Pointer(char und int). Der Fehler tritt selbst dann auf wenn ich alles in der Funktion auskommentiere.<br />
Ich weiß langsamm nicht mehr weiter, wie ich den Fehler einkreisen kann.<br />
Zu Erstellung der DLL habe ich das BCB Builder Tutorial verwendet.<br />
Habe die memmgr.lib eingebunden, brauch ich die überhaupt? Verwende keine dynamisch RTL.<br />
Ich hab noch was von Aufrufkonventionen gelesen, jedoch weiß nicht so recht etwas damit anzufangen.</p>
<p>Ich hoffe es kann mir jemand helfen.</p>
<p>MfG Stephan</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1061175</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1061175</guid><dc:creator><![CDATA[StephanK]]></dc:creator><pubDate>Fri, 19 May 2006 17:54:10 GMT</pubDate></item><item><title><![CDATA[Reply to DLL Codeguard RessourceLeak on Fri, 19 May 2006 18:24:34 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>die Meldung sagt, das du mit new oder malloc speicher anforderst, dann dann aber bis zum Ende des Programms nicht wieder ordnungsgemäß freigegeben wird.<br />
Warum die Meldung kommt, können wir aber ohne relevanten Code nicht sagen. Du kannst deine Suche auf jedenfall auf deine dynamische Speicherverwaltung konzentrieren.</p>
<p>bis bald<br />
akari</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1061198</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1061198</guid><dc:creator><![CDATA[akari]]></dc:creator><pubDate>Fri, 19 May 2006 18:24:34 GMT</pubDate></item><item><title><![CDATA[Reply to DLL Codeguard RessourceLeak on Fri, 19 May 2006 19:08:22 GMT]]></title><description><![CDATA[<p>Hallo zusammen</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/7971">@akari</a></p>
<p>So etwas hab ich mir schon gedacht, allerdings verwende ich keins von beidem.<br />
wie gesagt die dll Funktion ist momentan eine leere Funktion.<br />
Es soll später eine Struktur mit Daten gefüllt werden die als Pointer gecastet nach int übergeben wird.</p>
<p>DLL Funktion:</p>
<pre><code class="language-cpp">extern &quot;C&quot; __declspec (dllexport) void ExtractFileNameInfos(char *cFileName, int *iData)
{
/*        int iCountDelimiters;
        int iSerialNumberLength;
        char cTemp[512];
        strcpy(cTemp, cFileName);
        AnsiString sFileName = cTemp;

        FileNameInfos *Fni;
        Fni = (FileNameInfos *)iData;

        Fni-&gt;sFileExt = ExtractFileExt(sFileName);
        sFileName = ExtractFileNameWithoutExt(sFileName.UpperCase());
        iCountDelimiters = CountDelimiters(sFileName, &quot;_&quot;);

        //check if file is an mdf file
        if(sFileName.Pos(&quot;MDF&quot;) == 0)
        {
                Fni-&gt;bMeasurementDataFile = false;
        }
        else
        {
                Fni-&gt;bMeasurementDataFile = true;
                return;
        }

        //extract date and time
        Fni-&gt;sDate = ExtractTextInDelimiters(sFileName, iCountDelimiters-5, iCountDelimiters-2, &quot;_&quot;);
        Fni-&gt;sTime = ExtractTextInDelimiters(sFileName, iCountDelimiters-2, iCountDelimiters+1, &quot;_&quot;);

        //check if file contains _P_ or _F_
        if( (sFileName.Pos(&quot;_P_&quot;) == 0) &amp;&amp; sFileName.Pos(&quot;_F_&quot;) == 0)
        {
            //    Product_Serno_YYYY_MM_DD_HH_MM_SS.EXT       7
            //Product_Ver_Serno_YYYY_MM_DD_HH_MM_SS.EXT       8
            //Product.Ver_Serno_YYYY_MM_DD_HH_MM_SS.EXT       7

            //extract serialnumber
            Fni-&gt;sSerialNumber = ExtractTextInDelimiters(sFileName, iCountDelimiters-6, iCountDelimiters-5, &quot;_&quot;);
            //extract product
            Fni-&gt;sProduct = ExtractTextInDelimiters(sFileName, 0, iCountDelimiters-6, &quot;_&quot;);
        }
        else
        {
            //    Product_Serno_S_YYYY_MM_DD_HH_MM_SS.EXT     8
            //Product_Ver_Serno_S_YYYY_MM_DD_HH_MM_SS.EXT     9
            //Product.Ver_Serno_S_YYYY_MM_DD_HH_MM_SS.EXT     8
            //Product-PCB_Serno_S_YYYY_MM_DD_HH_MM_SS.EXT     8

            //extract Status
            Fni-&gt;sPassFail = ExtractTextInDelimiters(sFileName, iCountDelimiters-6, iCountDelimiters-5, &quot;_&quot;);
            //extract serialnumber
            Fni-&gt;sSerialNumber = ExtractTextInDelimiters(sFileName, iCountDelimiters-7, iCountDelimiters-6, &quot;_&quot;);
            //extract product
            Fni-&gt;sProduct =  ExtractTextInDelimiters(sFileName, 0, iCountDelimiters-7, &quot;_&quot;);

        }

//        without P and F
//        Product_Serno_YYYY_MM_DD_HH_MM_SS.EXT           7
//        Product_Ver_Serno_YYYY_MM_DD_HH_MM_SS.EXT       8
//        Product.Ver_Serno_YYYY_MM_DD_HH_MM_SS.EXT       7
//
//        with P and F
//        Product_Serno_S_YYYY_MM_DD_HH_MM_SS.EXT         8
//        Product_Ver_Serno_S_YYYY_MM_DD_HH_MM_SS.EXT     9
//        Product.Ver_Serno_S_YYYY_MM_DD_HH_MM_SS.EXT     8
//        Product-PCB_Serno_S_YYYY_MM_DD_HH_MM_SS.EXT     8

        //exchange _ with . in product
        if(Fni-&gt;sProduct.LastDelimiter(&quot;_&quot;) != 0)
        {
            Fni-&gt;sProduct = ExchangeFirstCharacter(&quot;_&quot;, &quot;.&quot;, Fni-&gt;sProduct);
        }
        //remove first char from serialnumber if length greater 7 and first char is 0
        iSerialNumberLength = Fni-&gt;sSerialNumber.Length();
        while(iSerialNumberLength &gt; 7)
        {
                if(Fni-&gt;sSerialNumber[1] == '0')
                {
                        Fni-&gt;sSerialNumber = Fni-&gt;sSerialNumber.SubString(2, iSerialNumberLength);
                }
                else
                {
                        break;
                }
                iSerialNumberLength = Fni-&gt;sSerialNumber.Length();
        }

        //extract fab code from serialnumber
        iSerialNumberLength = Fni-&gt;sSerialNumber.Length();
        Fni-&gt;sFabCode = Fni-&gt;sSerialNumber.SubString(iSerialNumberLength - 6, 7);
        Fni-&gt;sFabCode = Fni-&gt;sFabCode.SetLength(2);
        Fni-&gt;sFabCode = Fni-&gt;sFabCode.Trim();
*/
}
</code></pre>
<p>Im Dll Headerfile wird noch eine Struktur definiert.</p>
<p>Schnittstellen CPP:</p>
<pre><code class="language-cpp">/*******************************************************************************
Functionname:	ExtractFileNameInfos
Description:
Parameter 1:	char *cFileName
Parameter 2:	int *cData
Return:			int
Author:			
History:
19.05.2006	first version
*******************************************************************************/
int ExtractFileNameInfos(char *cFileName, int *cData)
{
    TypeExtractFileNameInfos *ExtractFileNameInfos;
    int iReturn = 0;
    HINSTANCE hDll;

    //load dll
    hDll = LoadLibrary(DLL_NAME);

    //check dll handle
    if(hDll != 0)
    {
        //get function address
        ExtractFileNameInfos = (TypeExtractFileNameInfos *)GetProcAddress(hDll, &quot;_ExtractFileNameInfos&quot;);

        //check function address
        if(ExtractFileNameInfos != 0)
        {
            //call dll function
            ExtractFileNameInfos(cFileName, cData);
        }
        else
        {
            //function address error
            iReturn = -2;
        }
    }
    else
    {
        //dll handle error
        iReturn = -1;
    }
    //unload dll
    int test = FreeLibrary(hDll);
    DWORD dwLastError = GetLastError();

    return iReturn;
}
</code></pre>
<p>Und zugehöriger Header:</p>
<pre><code class="language-cpp">typedef void TypeExtractFileNameInfos(char *cFileName, int *cData);

int ExtractFileNameInfos(char *cFileName, int *cData);

#define DLL_NAME                                &quot;Analyse.dll&quot;
</code></pre>
<p>Aufruf der Schnittstellenfunktion:</p>
<pre><code class="language-cpp">void __fastcall TForm1::Button1Click(TObject *Sender)
{
    struct FileNameInfos fni;
    int itest;
    ExtractFileNameInfos(&quot;C:\\Temp\\Protokollauswertung\\source_code\\_TestFiles\\HSP\\ES690.1_11_F_2006_02_06_15_43_02.hsp&quot;, &amp;itest);
    Memo1-&gt;Lines-&gt;Add(fni.sProduct);
    Memo1-&gt;Lines-&gt;Add(fni.sSerialNumber);
    Memo1-&gt;Lines-&gt;Add(fni.sPassFail);
    Memo1-&gt;Lines-&gt;Add(fni.sDate);
    Memo1-&gt;Lines-&gt;Add(fni.sTime);
    Memo1-&gt;Lines-&gt;Add(fni.sFileExt);
    Memo1-&gt;Lines-&gt;Add(fni.sFabCode);
}
</code></pre>
<p>Dies ist momentan ein Testanwendung die eigentlich nichts anderes macht als die DLL Funktion aufzurufen.</p>
<p>MfG Stephan</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1061220</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1061220</guid><dc:creator><![CDATA[StephanK]]></dc:creator><pubDate>Fri, 19 May 2006 19:08:22 GMT</pubDate></item><item><title><![CDATA[Reply to DLL Codeguard RessourceLeak on Fri, 19 May 2006 19:18:33 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>ich sehe jetzt keinen Fehler. nur eins verwundert mich schon</p>
<pre><code class="language-cpp">int ExtractFileNameInfos(char *cFileName, int *cData)
{
  ...
  ExtractFileNameInfos = (TypeExtractFileNameInfos *)GetProcAddress(hDll, &quot;_ExtractFileNameInfos&quot;); 
}
</code></pre>
<p>Du hast eine Funktionsimplementation, in der du dem Funktionssybol eine andere dynamische Adresse zuweist. Ob das wirklich erlaubt ist weiß ich nicht, aber es könnte schon eine ursache für seltsame Speicherfehler sein.<br />
Natürlich ist dort lokal ein Funktionspointer mit gleichem Namen angelegt, aber das muß nicht viel heißen.</p>
<p>/Edit :; und du solltest die char*-Parameter noch als const dekalrieren, weil du ja String-Literale übergibst, die nicht veränert werden können/dürfen.</p>
<p>bis bald<br />
akari</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1061223</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1061223</guid><dc:creator><![CDATA[akari]]></dc:creator><pubDate>Fri, 19 May 2006 19:18:33 GMT</pubDate></item><item><title><![CDATA[Reply to DLL Codeguard RessourceLeak on Fri, 19 May 2006 19:20:25 GMT]]></title><description><![CDATA[<p>Hi</p>
<p>Du hast Recht, jedoch es hat leider keinen Einfluß ;-((</p>
<p>MfG Stephan</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1061227</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1061227</guid><dc:creator><![CDATA[StephanK]]></dc:creator><pubDate>Fri, 19 May 2006 19:20:25 GMT</pubDate></item><item><title><![CDATA[Reply to DLL Codeguard RessourceLeak on Fri, 19 May 2006 20:18:13 GMT]]></title><description><![CDATA[<p>Hallo zusammen</p>
<p>Also wenn ich dies richtig sehe, ist dies ein Bug vom BCB / CodeGuard.<br />
<a href="http://qc.borland.com/wc/qcmain.aspx?d=3919" rel="nofollow">http://qc.borland.com/wc/qcmain.aspx?d=3919</a></p>
<p>MfG Stephan</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1061262</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1061262</guid><dc:creator><![CDATA[StephanK]]></dc:creator><pubDate>Fri, 19 May 2006 20:18:13 GMT</pubDate></item></channel></rss>