<?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 laden mit LoadLibrary()]]></title><description><![CDATA[<p>Hallo !</p>
<p>ich habe eine DLL geschrieben, die ich in verschiedenen Programmen benutzen und auch auf einen gemeinsamen Speicherbereich der DLL zugreifen möchte.<br />
Also die benutzenden Programme sollen auf einen Datensatz zugreifen.</p>
<p>Es sieht aber nun so aus, als ob jeweis eine neue Instanz angelegt wird, mit natürlich einem eigenen Datensatz.</p>
<p>Aus meinem Hauptprogramm</p>
<pre><code>void __fastcall TForm2::FormShow(TObject *Sender)
{
	HMODULE hDLL = LoadLibrary(&quot;DLL_TestProjekt.dll&quot;);

	if (hDLL &gt;0) {

		iTest = (int*) GetProcAddress(hDLL, &quot;_TestCount&quot;);
		Label1-&gt;Caption = IntToStr(iTest);
		long* pHilf = (long*) (GetProcAddress(hDLL, &quot;_pMainFormDlg&quot;));
		MF_Dlg = (TMainFormDlg*) *pHilf;
		Label1-&gt;Caption = IntToStr(MF_Dlg);
	}
}
</code></pre>
<p>Aus meiner DLL</p>
<pre><code>__declspec( dllexport ) int	TestCount = 37;
__declspec( dllexport ) TMainFormDlg*	pMainFormDlg = NULL;

int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
	Application-&gt;CreateForm(__classid(TMainFormDlg), &amp;MainFormDlg);
	pMainFormDlg = MainFormDlg;
	pMainFormDlg-&gt;pTestCount = &amp;TestCount;
	return 1;
}
</code></pre>
<p>TestCount und pMainFormDlg beziehen sich immer auf eine Instanz, des die DLL benutzenden Hauptprogrammes. Und genau das will ich nicht.</p>
<p>Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/196555/dll-laden-mit-loadlibrary</link><generator>RSS for Node</generator><lastBuildDate>Tue, 18 Aug 2026 14:04:20 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/196555.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 31 Oct 2007 09:38:58 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to DLL laden mit LoadLibrary() on Wed, 31 Oct 2007 09:38:58 GMT]]></title><description><![CDATA[<p>Hallo !</p>
<p>ich habe eine DLL geschrieben, die ich in verschiedenen Programmen benutzen und auch auf einen gemeinsamen Speicherbereich der DLL zugreifen möchte.<br />
Also die benutzenden Programme sollen auf einen Datensatz zugreifen.</p>
<p>Es sieht aber nun so aus, als ob jeweis eine neue Instanz angelegt wird, mit natürlich einem eigenen Datensatz.</p>
<p>Aus meinem Hauptprogramm</p>
<pre><code>void __fastcall TForm2::FormShow(TObject *Sender)
{
	HMODULE hDLL = LoadLibrary(&quot;DLL_TestProjekt.dll&quot;);

	if (hDLL &gt;0) {

		iTest = (int*) GetProcAddress(hDLL, &quot;_TestCount&quot;);
		Label1-&gt;Caption = IntToStr(iTest);
		long* pHilf = (long*) (GetProcAddress(hDLL, &quot;_pMainFormDlg&quot;));
		MF_Dlg = (TMainFormDlg*) *pHilf;
		Label1-&gt;Caption = IntToStr(MF_Dlg);
	}
}
</code></pre>
<p>Aus meiner DLL</p>
<pre><code>__declspec( dllexport ) int	TestCount = 37;
__declspec( dllexport ) TMainFormDlg*	pMainFormDlg = NULL;

int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
	Application-&gt;CreateForm(__classid(TMainFormDlg), &amp;MainFormDlg);
	pMainFormDlg = MainFormDlg;
	pMainFormDlg-&gt;pTestCount = &amp;TestCount;
	return 1;
}
</code></pre>
<p>TestCount und pMainFormDlg beziehen sich immer auf eine Instanz, des die DLL benutzenden Hauptprogrammes. Und genau das will ich nicht.</p>
<p>Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1395046</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1395046</guid><dc:creator><![CDATA[MyOwnShadow]]></dc:creator><pubDate>Wed, 31 Oct 2007 09:38:58 GMT</pubDate></item><item><title><![CDATA[Reply to DLL laden mit LoadLibrary() on Wed, 31 Oct 2007 16:58:32 GMT]]></title><description><![CDATA[<p>Für diesen Fall hatte ich mir mal folgendes geschrieben:</p>
<pre><code class="language-cpp">// shareddata.hpp
#ifndef _UCL_SHAREDDATA_HPP
#define _UCL_SHAREDDATA_HPP

#include &lt;windows.h&gt;
#include &lt;typeinfo&gt;
#include &lt;cstring&gt;
#include &lt;cstdio&gt;
#include &lt;new&gt;

namespace ucl
{

namespace win
{

template &lt;typename T&gt; class SharedData
{
private:
    class wrapper_t
    {
    private:
        unsigned refcnt;

        wrapper_t (void)
         : refcnt (1)
        {}
        ~wrapper_t (void)
        {}

    public:
        T obj;

        static void create (void* mem)
        { new (mem) wrapper_t; }
        void addRef (void)
        { ++refcnt; }
        void removeRef (void)
        {
            if (--refcnt == 0)
            {
                this-&gt;~wrapper_t ();
                return true;
            }
            return false;
        }
    };

    HANDLE hSharedData;
    wrapper_t* _data;

public:
    SharedData (const char* name);
    ~SharedData (void);

    T* get (void) { return &amp;(_data-&gt;obj); }
    T* operator -&gt; (void) { return &amp;(_data-&gt;obj); }
    T&amp; operator * (void) { return _data-&gt;obj; }

    const T* get (void) const { return &amp;(_data-&gt;obj); }
    const T* operator -&gt; (void) const { return &amp;(_data-&gt;obj); }
    const T&amp; operator * (void) const { return _data-&gt;obj; }
};

template &lt;typename T&gt;
SharedData &lt;T&gt;::SharedData (const char* name)
{
    unsigned nl, tl;
    char* buf;
    const char* tn;
    bool existing;

    tn = typeid (T).name ();
    nl = std::strlen (name);
    tl = std::strlen (tn);
    buf = new char[nl + tl + 7];
    std::sprintf (buf, &quot;ucl;%s;%s&quot;, tn, name);
    hSharedData = CreateFileMapping (INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0,
        sizeof (wrapper_t), buf);
    existing = (GetLastError () != ERROR_ALREADY_EXISTS);
    delete [] buf;

    if (!hSharedData)
        return;

    _data = (wrapper_t*) MapViewOfFile (hSharedData, FILE_MAP_ALL_ACCESS, 0, 0, 0);
    if (existing)
        _data-&gt;addRef ();
    else
        wrapper_t::create (_data);
}

template &lt;typename T&gt;
SharedData &lt;T&gt;::~SharedData (void)
{
    _data-&gt;removeRef ();
    UnmapViewOfFile (_data);
    CloseHandle (hSharedData);
    _data = NULL;
}

} // namespace win

} // namespace ucl

#endif // _UCL_SHAREDDATA_HPP
</code></pre>
<p>Verwenden kannst du es wie folgt:</p>
<pre><code class="language-cpp">// dllmain.cpp

#include &quot;shareddata.hpp&quot;

struct my_shared_data_t
{
    int foo;

    my_shared_data_t (void)
     : foo (0)
    {}
    ~my_shared_data_t (void)
    {}
};

ucl::win::SharedData &lt;my_shared_data_t&gt; msd (&quot;Ein_Name_für_deine_DLL&quot;);

void someDLLFunction (void)
{
    msd-&gt;foo = 12;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1395418</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1395418</guid><dc:creator><![CDATA[audacia]]></dc:creator><pubDate>Wed, 31 Oct 2007 16:58:32 GMT</pubDate></item><item><title><![CDATA[Reply to DLL laden mit LoadLibrary() on Thu, 01 Nov 2007 12:15:54 GMT]]></title><description><![CDATA[<p>Super, vielen Dank !!!!!!!!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1395832</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1395832</guid><dc:creator><![CDATA[MyOwnShadow]]></dc:creator><pubDate>Thu, 01 Nov 2007 12:15:54 GMT</pubDate></item></channel></rss>