<?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 Speicher Problem]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich möchte einen Engine programmieren.. Für den benutzer des Engine soll eine DLL und ein Interface zur Verfügung stehen:</p>
<pre><code class="language-cpp">/// &lt;summary&gt;
/// S7 Game Engine namespace.
/// &lt;/summary&gt;
namespace S7Engine
{
	typedef
		/// &lt;summary&gt;
		/// Represents a S7 resulting value.
		/// &lt;/summary&gt;
		HRESULT TS7RESULT;	

	const 
		/// &lt;summary&gt;
		/// Success result.
		/// &lt;/summary&gt;
		TS7RESULT S7SUCCESS = HRESULT(0);

		/// &lt;summary&gt;
		/// Failed result.
		/// &lt;/summary&gt;
		TS7RESULT S7FAILED = HRESULT(-1);

	/// &lt;summary&gt;
	/// Represents a S7 engine.
	/// &lt;/summary&gt;
	class IS7Interface
	{
	public:
		/// &lt;summary&gt;
		/// Destructor.
		/// &lt;/summary&gt;
		virtual ~IS7Interface() {};

		/// &lt;summary&gt;
		/// Device initialisation.
		/// &lt;/summary&gt;
		virtual TS7RESULT InitDevice() = 0;
	};
};
</code></pre>
<p>Soweit so gut. Ich exportiere mit der DLL zwei Methoden:</p>
<pre><code class="language-cpp">extern &quot;C&quot;
{
	__declspec(dllexport) void CreateS7Device(S7Engine::IS7Interface*&amp; device)
	{
		device = new S7Engine::TS7Engine();
	}

	__declspec(dllexport) void ReleaseS7Device(S7Engine::IS7Interface* device)
	{
		if (device != 0)
			delete device;
	}
}
</code></pre>
<p>Der Benutzer soll also über die DLL die CreateS7Device aufrufen und damit dann einen Zeiger auf den Engine zurückbekommen, der das Interface implementiert. Hierdurch könnte er dann die Methoden des Engine verwenden (Im Beispiel nur die Init device).</p>
<p>TS7Engine implementiert das Interface:</p>
<pre><code class="language-cpp">class TS7Engine: public IS7Interface
	{
	public:
		virtual TS7RESULT InitDevice();
	};
</code></pre>
<p>Ich erhalte eine DLL beim Builden.<br />
Nun möchte ich diese verwenden:</p>
<pre><code class="language-cpp">HINSTANCE hInstLibrary = 0;

void CreateDLLAccess(std::string name, S7Engine::IS7Interface*&amp; s7)
{

	hInstLibrary = LoadLibrary(L&quot;S7 Engine.dll&quot;);

   if (hInstLibrary)
   {
	   CreateS7Device _CreateDev = (CreateS7Device)GetProcAddress(hInstLibrary, &quot;CreateS7Device&quot;);

      if (_CreateDev)
      {
		  _CreateDev(s7);
	  }

   }   
}
</code></pre>
<p>Diese Methode ruft die Methode aus der DLL auf und sollte mir einen Zeiger auf den erstellten engine zurück liefern.<br />
Der Code CreateS7Device des engines wird auch ausgeführt, nur erhalte ich eine Speicher exception:</p>
<p>Eine nicht behandelte Ausnahme des Typs &quot;System.AccessViolationException&quot; ist in mscorlib.dll aufgetreten.</p>
<p>Zusätzliche Informationen: Es wurde versucht, im geschützten Speicher zu lesen oder zu schreiben. Dies ist häufig ein Hinweis darauf, dass anderer Speicher beschädigt ist.</p>
<p>Wenn ich in der CreateS7Device folgendes mache, gibt es keine Exception:</p>
<pre><code class="language-cpp">__declspec(dllexport) void CreateS7Device(S7Engine::IS7Interface*&amp; device)
	{
		return ;
	}
</code></pre>
<p>Sprich ich darf anscheinend nicht den Wert des Zeigers verändern... Das muss ich ja aber!</p>
<p>Wie komme ich denn raus aus der Situation. Dieses Designstil habe ich in einem Buch gelesen, dieses habe ich aber leider nicht mehr.</p>
<p>Infos:<br />
Visual Studio 2010<br />
.Net Framework 4</p>
<p>Danke!</p>
<p>Edit::<br />
Mir ist gerade aufgefallen, dass die Exception nicht erscheint,<br />
WENN ICH ALS 64BIT ANWENDUNG KOMPILIERE.<br />
Was soll das denn???</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/286670/dll-speicher-problem</link><generator>RSS for Node</generator><lastBuildDate>Wed, 19 Aug 2026 08:52:58 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/286670.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 14 May 2011 09:28:43 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to DLL Speicher Problem on Sat, 14 May 2011 09:47:42 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich möchte einen Engine programmieren.. Für den benutzer des Engine soll eine DLL und ein Interface zur Verfügung stehen:</p>
<pre><code class="language-cpp">/// &lt;summary&gt;
/// S7 Game Engine namespace.
/// &lt;/summary&gt;
namespace S7Engine
{
	typedef
		/// &lt;summary&gt;
		/// Represents a S7 resulting value.
		/// &lt;/summary&gt;
		HRESULT TS7RESULT;	

	const 
		/// &lt;summary&gt;
		/// Success result.
		/// &lt;/summary&gt;
		TS7RESULT S7SUCCESS = HRESULT(0);

		/// &lt;summary&gt;
		/// Failed result.
		/// &lt;/summary&gt;
		TS7RESULT S7FAILED = HRESULT(-1);

	/// &lt;summary&gt;
	/// Represents a S7 engine.
	/// &lt;/summary&gt;
	class IS7Interface
	{
	public:
		/// &lt;summary&gt;
		/// Destructor.
		/// &lt;/summary&gt;
		virtual ~IS7Interface() {};

		/// &lt;summary&gt;
		/// Device initialisation.
		/// &lt;/summary&gt;
		virtual TS7RESULT InitDevice() = 0;
	};
};
</code></pre>
<p>Soweit so gut. Ich exportiere mit der DLL zwei Methoden:</p>
<pre><code class="language-cpp">extern &quot;C&quot;
{
	__declspec(dllexport) void CreateS7Device(S7Engine::IS7Interface*&amp; device)
	{
		device = new S7Engine::TS7Engine();
	}

	__declspec(dllexport) void ReleaseS7Device(S7Engine::IS7Interface* device)
	{
		if (device != 0)
			delete device;
	}
}
</code></pre>
<p>Der Benutzer soll also über die DLL die CreateS7Device aufrufen und damit dann einen Zeiger auf den Engine zurückbekommen, der das Interface implementiert. Hierdurch könnte er dann die Methoden des Engine verwenden (Im Beispiel nur die Init device).</p>
<p>TS7Engine implementiert das Interface:</p>
<pre><code class="language-cpp">class TS7Engine: public IS7Interface
	{
	public:
		virtual TS7RESULT InitDevice();
	};
</code></pre>
<p>Ich erhalte eine DLL beim Builden.<br />
Nun möchte ich diese verwenden:</p>
<pre><code class="language-cpp">HINSTANCE hInstLibrary = 0;

void CreateDLLAccess(std::string name, S7Engine::IS7Interface*&amp; s7)
{

	hInstLibrary = LoadLibrary(L&quot;S7 Engine.dll&quot;);

   if (hInstLibrary)
   {
	   CreateS7Device _CreateDev = (CreateS7Device)GetProcAddress(hInstLibrary, &quot;CreateS7Device&quot;);

      if (_CreateDev)
      {
		  _CreateDev(s7);
	  }

   }   
}
</code></pre>
<p>Diese Methode ruft die Methode aus der DLL auf und sollte mir einen Zeiger auf den erstellten engine zurück liefern.<br />
Der Code CreateS7Device des engines wird auch ausgeführt, nur erhalte ich eine Speicher exception:</p>
<p>Eine nicht behandelte Ausnahme des Typs &quot;System.AccessViolationException&quot; ist in mscorlib.dll aufgetreten.</p>
<p>Zusätzliche Informationen: Es wurde versucht, im geschützten Speicher zu lesen oder zu schreiben. Dies ist häufig ein Hinweis darauf, dass anderer Speicher beschädigt ist.</p>
<p>Wenn ich in der CreateS7Device folgendes mache, gibt es keine Exception:</p>
<pre><code class="language-cpp">__declspec(dllexport) void CreateS7Device(S7Engine::IS7Interface*&amp; device)
	{
		return ;
	}
</code></pre>
<p>Sprich ich darf anscheinend nicht den Wert des Zeigers verändern... Das muss ich ja aber!</p>
<p>Wie komme ich denn raus aus der Situation. Dieses Designstil habe ich in einem Buch gelesen, dieses habe ich aber leider nicht mehr.</p>
<p>Infos:<br />
Visual Studio 2010<br />
.Net Framework 4</p>
<p>Danke!</p>
<p>Edit::<br />
Mir ist gerade aufgefallen, dass die Exception nicht erscheint,<br />
WENN ICH ALS 64BIT ANWENDUNG KOMPILIERE.<br />
Was soll das denn???</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2063163</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2063163</guid><dc:creator><![CDATA[bjoernt]]></dc:creator><pubDate>Sat, 14 May 2011 09:47:42 GMT</pubDate></item><item><title><![CDATA[Reply to DLL Speicher Problem on Sat, 14 May 2011 13:04:03 GMT]]></title><description><![CDATA[<p>C++ kennt keine DLLs - ich bin mir allerdings noch nicht sicher, ob du im CLI-Board oder in der WinAPI besser aufgehoben wärst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2063262</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2063262</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Sat, 14 May 2011 13:04:03 GMT</pubDate></item><item><title><![CDATA[Reply to DLL Speicher Problem on Sat, 14 May 2011 13:13:39 GMT]]></title><description><![CDATA[<p>1. Dein Code ist C++, C++/CLI kommt erst ins Spiel, weil es mit dem /clr Schalter kompiliert wurde.<br />
2. Genau diesen Schalter würde ich ausschalten - warum benötigst Du hier .NET? Und wenn Du .NET benötigst - warum dann nicht gleich ein .NET Assemlby?</p>
<p>Mein Tipp - entweder .NET ausschalten (/clr wegnehmen) oder dann auf .NET setzten und das ganze z.B. in C# machen.</p>
<p>Zu deinem Problem - benutz den Debugger - der sagt üblicherweise WO die Access Violation aufgetreten ist.</p>
<p>BTW: vor dem delete muss nicht auf 0 geprüft werden, dass kann delete selbst.</p>
<p>**Edit:**Mir ist erst jetzt dein Edit aufgefallen - mein gesagtes behält aber Gültigkeit.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2063269</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2063269</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Sat, 14 May 2011 13:13:39 GMT</pubDate></item><item><title><![CDATA[Reply to DLL Speicher Problem on Sun, 15 May 2011 16:55:51 GMT]]></title><description><![CDATA[<p>Danke erstmal für die Antworten.</p>
<p>Huh da steigt ja keiner mehr durch..</p>
<p>Ich möchte einen DirectX-Game-Engine samt zugehörigem Editor entwickeln.<br />
Der Engine soll als seperate DLL Vorliegen.</p>
<p>Also wenn ich das richtig verstanden habe empfiehlt ihr mir für die Oberfläche C# und für den Engine c++, oder? (DirectX-Header ist ja in c++).</p>
<p>Was ist mit dem komischen clr schalter?</p>
<p>Gruß<br />
Björn</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2063723</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2063723</guid><dc:creator><![CDATA[bjoernt]]></dc:creator><pubDate>Sun, 15 May 2011 16:55:51 GMT</pubDate></item><item><title><![CDATA[Reply to DLL Speicher Problem on Sun, 15 May 2011 18:53:11 GMT]]></title><description><![CDATA[<p>Der /clr Schalter ist ein Compiler Flag, welcher dir die Nutzung des .NET Frameworks / Runtime ermöglicht.<br />
<strong>Edit:</strong> <a href="http://msdn.microsoft.com/en-us/library/k8d11d4s.aspx" rel="nofollow">http://msdn.microsoft.com/en-us/library/k8d11d4s.aspx</a></p>
<blockquote>
<p>Also wenn ich das richtig verstanden habe empfiehlt ihr mir für die Oberfläche C# und für den Engine c++, oder? (DirectX-Header ist ja in c++).</p>
</blockquote>
<p>Nein. Meine Empfehlung ist es dich zu entscheiden, ob managed oder nicht.<br />
AFAIK gibts DirectX auch in einer managed Version. Falls Du die C# Schiene fahren möchtest, kannst Du auch mal XNA angucken.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2063776</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2063776</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Sun, 15 May 2011 18:53:11 GMT</pubDate></item><item><title><![CDATA[Reply to DLL Speicher Problem on Mon, 16 May 2011 11:59:37 GMT]]></title><description><![CDATA[<p>Du solltest Deinen dll relevanten Header stark vereinfachen, und am Besten nur C-Typen anbieten:</p>
<pre><code class="language-cpp">//s7_engine_dll_entry.h

#ifndef __include_guard
#define __include_guard

extern &quot;C&quot;
{
    //nur deklaration
    struct s7_interface;

    typedef struct s7_interface * s7_interface_handle;

    is7_interface_handle create_s7_instance(void);

    void destry_s7_instace(s7_interface_handle handle);    
}

#endif __include_guard
</code></pre>
<p>Wenn Du die dll immer dynamisch laden willst (mittels <code>LoadLibrary</code> ), braucht es das <code>dll_export</code> Zeugs nicht. Ansonsten: Hinzufügen.</p>
<p>Die Arbeit wird dann in der Implementierung gemacht:</p>
<pre><code class="language-cpp">//s7_engine_dll_entry.cpp

#include &quot;s7_engine_dll_entry.h&quot;

struct s7_interface
{
    virtual init() = 0;
    //hier ggf Ctor definieren
};

class s7_engine : public s7_interface
{
public:
    virtual init(){ ... }
};

is7_interface_handle create_s7_instance(void)
{
    return new s7_interface();
}

void destry_s7_instace(s7_interface_handle handle)
{
    delete handle;
}
</code></pre>
<p>ALternativ kannst Du auch die Implementierung in die zurückgegebene Struktur wrappen (ich finde das eigentlich besser).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2064004</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2064004</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Mon, 16 May 2011 11:59:37 GMT</pubDate></item><item><title><![CDATA[Reply to DLL Speicher Problem on Wed, 29 Jun 2011 17:39:03 GMT]]></title><description><![CDATA[<p>Hallo nochmal,</p>
<p>ich kriege dieses 64/32 bit Problem nicht in den Griff, mir ist das schleierhaft.</p>
<p>Ich laden mit LoadLibrary.</p>
<p>Interface: S7 Interface.h</p>
<pre><code class="language-cpp">/// &lt;summary&gt; 
	/// Represents a S7 engine interface. 
	/// &lt;/summary&gt; 
	struct IS7Interface 
	{ 
		public: 

			/// &lt;summary&gt; 
			/// Device initialisation. 
			/// &lt;/summary&gt; 
			virtual TS7RESULT InitDevice(HWND hWnd) = 0; 

			virtual TS7RESULT RenderDevice() = 0;
	};
</code></pre>
<p>Engine Header: (S7 Engine.h)</p>
<pre><code class="language-cpp">#ifndef _S7ENGINE_H_
#define _S7ENGINE_H_

#include &quot;S7 Interface.h&quot;
#include &quot;D3DX11.h&quot;
#include &quot;D3D11.h&quot;

class TS7Engine: public IS7Interface
{
	public:			
		virtual TS7RESULT InitDevice(HWND hWnd);
		virtual TS7RESULT RenderDevice();
	private:
		ID3D11Device*	gDevice;	
		ID3D11RenderTargetView*	gRenderTarget;	
		IDXGISwapChain*	gSwapChain;
		ID3D11DeviceContext* ImmCont;
};

extern &quot;C&quot; 
 { 
     __declspec(dllexport) IS7Interface* CreateS7Device() 
     { 		
        return new TS7Engine(); 
     } 

     __declspec(dllexport) void ReleaseS7Device(IS7Interface* device) 
     { 
         if (device != 0) 
             delete device; 
     } 
 }

#endif
</code></pre>
<p>Engine Implementierung: S7 Engine.cpp</p>
<pre><code class="language-cpp">#define DEBUG

#include &quot;S7 Engine.h&quot;
#include &lt;D3DX11.h&gt;
#include &lt;D3D11.h&gt;
//#include &lt;D3DX10.h&gt;
#include &lt;DXUT.h&gt;

TS7RESULT TS7Engine::InitDevice(HWND hWnd)
{	

		// Swap Chain Desc füllen (Konfiguration)
        DXGI_SWAP_CHAIN_DESC dsc = {0};
        dsc.BufferCount = 1;
        dsc.BufferDesc.Width = 1024;
        dsc.BufferDesc.Height = 768;
        dsc.BufferDesc.RefreshRate.Denominator = 1; // 60Hz
        dsc.BufferDesc.RefreshRate.Numerator = 60;      
        dsc.Windowed = true;
        dsc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; // 32Bit + Alpha
        dsc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;  // Als Render Target benutzen
        dsc.OutputWindow = hWnd; // Unser Fenster übergeben
        dsc.SampleDesc.Count = 1;        // Qualität des Samplings = 1
        dsc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;       // Pointertausch statt kopieren

        // Device erzeugen
        if(FAILED(D3D11CreateDeviceAndSwapChain(NULL /*Standardadapter*/,
                                D3D_DRIVER_TYPE_HARDWARE /* Hardware */,
                                NULL /* Kein Softwaremodul */,
                                0, // Keine Flags
								NULL,
								NULL,
                                D3D11_SDK_VERSION, // SDK-Version benutzen
                                &amp;dsc, // Konfigurationsstrutktur
                                &amp;gSwapChain, // Swap Chain
                                &amp;gDevice, NULL, &amp;ImmCont))) // Device
                return S7FAILED;

		// Create a render target view
    ID3D11Texture2D *pBackBuffer;
    if( FAILED( gSwapChain-&gt;GetBuffer( 0, __uuidof( ID3D11Texture2D ), (LPVOID*)&amp;pBackBuffer ) ) )
        return FALSE;
    HRESULT hr = gDevice-&gt;CreateRenderTargetView( pBackBuffer, NULL, &amp;gRenderTarget );
    pBackBuffer-&gt;Release();
    if( FAILED( hr ) )
        return FALSE;
    ImmCont-&gt;OMSetRenderTargets( 1, &amp;gRenderTarget, NULL );

	D3D11_VIEWPORT vp;
    vp.Width = (FLOAT)1024;
    vp.Height = (FLOAT)768;
    vp.MinDepth = 0.0f;
    vp.MaxDepth = 1.0f;
    vp.TopLeftX = 0;
    vp.TopLeftY = 0;
    ImmCont-&gt;RSSetViewports( 1, &amp;vp );

	return S7SUCCESS;
	}

TS7RESULT TS7Engine::RenderDevice()
{

		//
        // Clear the backbuffer
        //
        float ClearColor[4] = { 0.0f, 0.125f, 0.6f, 1.0f }; // RGBA
        ImmCont-&gt;ClearRenderTargetView( gRenderTarget, ClearColor );

        gSwapChain-&gt;Present( 0, 0 );

		return S7SUCCESS;
}
</code></pre>
<p>Ich kompiliere ohne /clr.</p>
<p>In meinem Aufrufenden Projekt sieht es so aus:</p>
<pre><code class="language-cpp">// S7 WorldEditor.cpp: Hauptprojektdatei.

#include &quot;stdafx.h&quot;
#include &quot;Form1.h&quot;

using namespace S7WorldEditor;

IS7Interface* dll = NULL;

void MyEventHandler(Object^ o, EventArgs ^)
{
  dll-&gt;RenderDevice();	
}

[STAThreadAttribute]
int main(array&lt;System::String ^&gt; ^args)
{
	// Aktivieren visueller Effekte von Windows XP, bevor Steuerelemente erstellt werden
	Application::EnableVisualStyles();
	Application::SetCompatibleTextRenderingDefault(false); 

	dll = CreateDLLAccess(L&quot;S7 Engine.dll&quot;);
	Form^ frm = gcnew Form1();
	HRESULT res = dll-&gt;InitDevice((HWND)frm-&gt;Handle.ToPointer());
	Application::Idle += gcnew EventHandler(MyEventHandler);

	// Hauptfenster erstellen und ausführen
	Application::Run(frm);
	return 0;
}
</code></pre>
<p>mit dem DLL-Loader:</p>
<pre><code class="language-cpp">#ifndef _S7DLLACCESS_H
#define _S7DLLACCESS_H

#include &lt;Windows.h&gt;
#include &quot;..\..\Source\S7 Engine\S7 Interface.h&quot; 

HINSTANCE hInstLibrary = 0; 

#define CREATES7DEVICEDLLNAME &quot;CreateS7Device&quot;
#define RELEASES7DEVICEDLLNAME &quot;ReleaseS7Device&quot;

typedef
	/// &lt;summary&gt;
	/// Interface creation. Exported method.
	/// &lt;/summary&gt;
	IS7Interface* (*CreateS7Device)();

	/// &lt;summary&gt;
	/// Interface delete. Exported method.
	/// &lt;/summary&gt;
	void (*ReleaseS7Device)(IS7Interface*);

IS7Interface* CreateDLLAccess(LPCWSTR name) 
{      
    hInstLibrary = LoadLibrary(name); 

    if (hInstLibrary) 
    { 
		CreateS7Device _CreateDev = (CreateS7Device)GetProcAddress(hInstLibrary, CREATES7DEVICEDLLNAME); 

		if (_CreateDev != NULL)
			return _CreateDev();              
    }   

	return NULL;
 }

#endif
</code></pre>
<p>So nun zur Situation:<br />
Wenn ich alles beides als 64 bit kompiliere, funktioniert es and anstandslos.<br />
Bei 32 bit schmeisst die Methode D3D11CreateDeviceAndSwapChain in S7 Engine.cpp einen Fehler zurück (also als Result). Im DX Log steht:</p>
<blockquote>
<p>DXGI Warning: IDXGIFactory::CreateSwapChain: Warning:<br />
DXGI_SWAP_CHAIN_DESC.OutputWindow is not a valid window handle...<br />
DXGI Error: Swapchains may not target a window that is not owned by the<br />
calling process.</p>
</blockquote>
<p>Offensichtlich wird das handle bei dem 64 bit kompilieren richtig übergeben, bei 32 bit falsch... WIESO UM ALLES IN DER WELT?</p>
<p>Ich besitzte ein 64 bit System.</p>
<p>Jemand eine Idee?</p>
<p>Gruß<br />
Björn</p>
<p>Edit: Ich habe das ermittelte Handle in der Hauptanwendung mal überprüft... es ist richtig, es hat den selben Wert wie hiermit ermittelt: <a href="http://www.codeguru.com/cpp/misc/samples/article.php/c1489" rel="nofollow">http://www.codeguru.com/cpp/misc/samples/article.php/c1489</a></p>
<p>Edit2: OK das aufrufende Programm ermittelt das Handle richtig...<br />
Aber: Es kommt bei 32bit ein falscher Wert in der DLL an. Bei 64bit ist er richtig. Warum das so ist weiß ich nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2086195</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2086195</guid><dc:creator><![CDATA[bjoernt]]></dc:creator><pubDate>Wed, 29 Jun 2011 17:39:03 GMT</pubDate></item></channel></rss>