<?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 Instanzenzähler auslesen]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>gibt es eine Möglichkeit den aktuellen DLL-Instanzenzähler zu bestimmen? Z.B. wenn ich mich innerhalb der DLL befinde (beim Aufruf von DllMain mit DLL_PROCESS_ATTACH)?</p>
<p>Wenn nicht, was wäre denn eine Alternative um an diesen Wert zu kommen?</p>
<p>Vielen Dank schon einmal</p>
<p>Ciao</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/235728/dll-instanzenzähler-auslesen</link><generator>RSS for Node</generator><lastBuildDate>Tue, 07 Apr 2026 21:57:03 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/235728.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 05 Mar 2009 18:11:03 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to DLL Instanzenzähler auslesen on Thu, 05 Mar 2009 18:11:03 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>gibt es eine Möglichkeit den aktuellen DLL-Instanzenzähler zu bestimmen? Z.B. wenn ich mich innerhalb der DLL befinde (beim Aufruf von DllMain mit DLL_PROCESS_ATTACH)?</p>
<p>Wenn nicht, was wäre denn eine Alternative um an diesen Wert zu kommen?</p>
<p>Vielen Dank schon einmal</p>
<p>Ciao</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1674785</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1674785</guid><dc:creator><![CDATA[Reth]]></dc:creator><pubDate>Thu, 05 Mar 2009 18:11:03 GMT</pubDate></item><item><title><![CDATA[Reply to DLL Instanzenzähler auslesen on Thu, 05 Mar 2009 23:04:34 GMT]]></title><description><![CDATA[<p>Das ist eine Funktion von meinem ProcessExplorer Plugin:</p>
<pre><code class="language-cpp">sub GetDllLoadCount(opt BOOL interactive = false),DWORD
{
	DWORD    dwLoadCount = 0;
	HANDLE   hProcess;
	HMODULE  hModule;
	WCHAR *lpwszErrorString = NULL;
	DWORD         dwRequired;
	dwstring      wsz[64];
	LDR_MODULE    module;

	while (1)
	{
		hProcess = GetProcessHandle(0); // OpenProcess...
		if (!hProcess)
		{
			MessageBoxW(g_hwndApp, L&quot;OpenProcess failed&quot;,0,0);
			break;
		}
		hModule = GetListViewInt(g_hwndDlls, L&quot;Base&quot;, STIF_SUPPORT_HEX);
		if (!hModule)
		{
			lpwszErrorString = L&quot;invalid HMODULE&quot;;
			break;
		}
		PROCESS_BASIC_INFORMATION pbi;
		if (NtQueryInformationProcess(hProcess, ProcessBasicInformation, &amp;pbi, sizeof(pbi), &amp;dwRequired))
		{
			lpwszErrorString = L&quot;NtQueryInformationProcess failed&quot;;
			break;
		}
		PEB peblock;
		if (!ReadProcessMemory(hProcess, pbi.PebBaseAddress, &amp;peblock, sizeof(peblock), NULL))
		{
			lpwszErrorString = L&quot;failed to read PEB&quot;;
			break;
		}
		PEB_LDR_DATA  ldr;
		if (!ReadProcessMemory(hProcess, peblock.LoaderData, &amp;ldr, sizeof(ldr), NULL))
		{
			lpwszErrorString = L&quot;failed to read PEB_LDR_DATA&quot;;
			break;
		}
		if (!ldr.Initialized)
		{
			lpwszErrorString = L&quot;PEB_LDR_DATA is not initialized&quot;;
			break;
		}
		if (ldr.Length &lt; 20) // Length + Initialized + SsHandle + InLoadOrderModuleList
		{
			lpwszErrorString = L&quot;PEB_LDR_DATA is to small&quot;;
			break;
		}
		// enumerate all loaded modules
		LDR_MODULE *pFirst = ldr.InLoadOrderModuleList.Flink; // pointer valid in remote process context
		LDR_MODULE *pNode  = ldr.InLoadOrderModuleList.Flink; // pointer valid in remote process context
		while (1)
		{
			if (!ReadProcessMemory(hProcess, pNode, &amp;module, sizeof(module), NULL))
			{
				lpwszErrorString = L&quot;failed to read LDR_MODULE&quot;;
				break;
			}
			if (module.BaseAddress == hModule)
			{
				dwLoadCount = module.LoadCount; // ******** deine Antwort *****

				if (interactive)
				{
					if (module.LoadCount == -1)
					{
						MessageBoxW(g_hwndApp, L&quot;Module is loaded statically&quot;, L&quot;&quot;, 0);
					}
					else
					{
						wsprintf(wsz, L&quot;LoadCount: %d&quot;, module.LoadCount);
						MessageBoxW(g_hwndApp, wsz, L&quot;&quot;, 0);
					}
				}
				break;
			}
			pNode = module.InLoadOrderModuleList.Flink;
			if (pNode == pFirst) break;
		}
		if (!dwLoadCount)
		{
			lpwszErrorString = L&quot;The module was not found in process module list&quot;;
		}
		break;
	}

	if (hProcess)
	{
		CloseHandle(hProcess);
	}
	if (lpwszErrorString &amp;&amp; interactive)
	{
		MessageBoxW(g_hwndApp, lpwszErrorString);
	}
	return dwLoadCount;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1674988</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1674988</guid><dc:creator><![CDATA[sapero]]></dc:creator><pubDate>Thu, 05 Mar 2009 23:04:34 GMT</pubDate></item><item><title><![CDATA[Reply to DLL Instanzenzähler auslesen on Fri, 06 Mar 2009 07:31:30 GMT]]></title><description><![CDATA[<p>Warum zählst Du nicht eine Variable hoch/runter bei DLL_PROCESS_ATTACH/DLL_PROCESS_DETACH !?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1675026</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1675026</guid><dc:creator><![CDATA[Jochen Kalmbach]]></dc:creator><pubDate>Fri, 06 Mar 2009 07:31:30 GMT</pubDate></item><item><title><![CDATA[Reply to DLL Instanzenzähler auslesen on Fri, 06 Mar 2009 08:24:56 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/20713">@sapero</a>:</p>
<p>Vielen Dank für die Antwort. Werd ich mal ausprobieren.<br />
Brauche ich den ganzen Code, oder gibt es eine Kurzversion, wenn ich mich in der DLL befinde und nur den eigenen LoadCount wissen möchte.</p>
<p>Habe auch gerade gelesen, dass &quot;NtQueryInformationProcess&quot; in Zukunft ggf. nicht mehr unterstützt wird und das man alternative Funktionen verwenden solle. Allerdings habe ich noch keine gefunden, welche die ProcessBasicInformation füllt! Gibts da was?</p>
<p>Ein paar andere Fragen noch:</p>
<p>Was bedeutet das sub im folgenden Fragement und das &quot;,DWORD&quot; hinter dem Prozedurnamen?</p>
<pre><code class="language-cpp">sub GetDllLoadCount(opt BOOL interactive = false),DWORD
</code></pre>
<p>Und was bedeutet das &quot;L&quot; hier vor dem String?</p>
<pre><code class="language-cpp">lpwszErrorString = L&quot;invalid HMODULE&quot;;
</code></pre>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/5675">@Jochen</a> Kalmbach:</p>
<p>Da muss ich einen gemeinsamen Speicherbereich innerhalb der DLL verwalten, oder?<br />
Es wird ja jede Instanz in einen eigenen Prozess geladen und daher muss diese Variable von allen Instanzen gemeinsam verwendet werden.<br />
Den Aufwand hätte ich mir gern gespart.</p>
<p>Oder geht das mit einer Art globalen Variable? Wenn ja, dann wäre hier interessant, wie man den verteilten Zugriff aus den einzelnen Instanzen gegenseitig abschirmt.</p>
<p>Ciao</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1675048</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1675048</guid><dc:creator><![CDATA[Reth]]></dc:creator><pubDate>Fri, 06 Mar 2009 08:24:56 GMT</pubDate></item><item><title><![CDATA[Reply to DLL Instanzenzähler auslesen on Fri, 06 Mar 2009 09:40:27 GMT]]></title><description><![CDATA[<p>WAS hast Du denn genau vor? Warum willst Du das wissen?<br />
Du kannst natürlich eine Variable deklarieren, welche dann im Shared-Memory landet... und dann von allen Instanzen der DLL verwendet werden kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1675086</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1675086</guid><dc:creator><![CDATA[Jochen Kalmbach]]></dc:creator><pubDate>Fri, 06 Mar 2009 09:40:27 GMT</pubDate></item><item><title><![CDATA[Reply to DLL Instanzenzähler auslesen on Fri, 06 Mar 2009 09:48:53 GMT]]></title><description><![CDATA[<p>Du könntest auch einen Semaphore nehmen um die Zählung durchzuführen.</p>
<p>Nur was nützt Dir die Info, wenn der Usage Count im Moment n ist. Genau in diesem Moment ist die Information schon wieder veraltet und ein Prozess kann Deine DLL geladen haben... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1675092</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1675092</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Fri, 06 Mar 2009 09:48:53 GMT</pubDate></item><item><title><![CDATA[Reply to DLL Instanzenzähler auslesen on Fri, 06 Mar 2009 09:58:51 GMT]]></title><description><![CDATA[<p>Jochen Kalmbach schrieb:</p>
<blockquote>
<p>WAS hast Du denn genau vor? Warum willst Du das wissen?</p>
</blockquote>
<p>Muss ich kurz ausholen. Die DLL bietet neben weiteren 2 Funktionen an, die eine bestimmte Aktion anstarten bzw. wieder beenden.</p>
<p>Sinnvoll wäre hier also wohl ein gemeinsamer Zähler, auf den alle geladenen DLL-Instanzen gemeinsam zugreifen können (statische Variable?).</p>
<p>Ich möchte nun beim Aufruf der Funktion, welche die Aktion startet wissen, wie oft dies verteilt über alle geladenen DLL-Instanzen bereits passiert ist. Dazu wird der gemeinsame Zähler ausgelesen.</p>
<p>Beim Aufruf der Funktion, welche die Aktion beendet soll der gemeinsame Zähler wieder dekrementiert werden.</p>
<p>Die Frage ist nun, wie man diesen gemeinsamen Zähler innerhalb einer DLL programmiert und zwar auch so, dass nebenläufige Zugriffe sequenziert werden (nur eine DLL-Instanz soll zu einem Zeitpunkt den Zähler lesen oder schreiben können).</p>
<p>Geht das denn, ohne dass man ein Risiko schafft, dass eine DLL-Instanz an dem Semaphor (oder was immer dann zum Einsatz kommt) ewig wartet, weil die Instanz, die gerade den Zugriff auf den gemeinsamen Zähler hat abgeschossen wurde oder abgestürzt ist oder andere Probleme hat?</p>
<p>Ciao</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1675100</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1675100</guid><dc:creator><![CDATA[Reth]]></dc:creator><pubDate>Fri, 06 Mar 2009 09:58:51 GMT</pubDate></item><item><title><![CDATA[Reply to DLL Instanzenzähler auslesen on Fri, 06 Mar 2009 11:47:28 GMT]]></title><description><![CDATA[<p>Es ist sicherlich einfach es so zu gewährleisten das nur ein Prozess inkrementiert oder ausliest.</p>
<p>Aber das ist nicht Dein Problem. Du musst gewährleisten, dass für den Zeitraum in dem Du das ganze prüfst (als Lesen, Test und Reaktion) kein weiterer Prozess dazukommt.<br />
Da ist es aber längst dazu gekommen,dass ein anderer Prozess die DLL evtl. schon iweder geladen hat...</p>
<p>IMHO ist das auf Low-Level Ebene in der DLL nicht zu erreichen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1675170</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1675170</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Fri, 06 Mar 2009 11:47:28 GMT</pubDate></item><item><title><![CDATA[Reply to DLL Instanzenzähler auslesen on Fri, 06 Mar 2009 12:22:39 GMT]]></title><description><![CDATA[<p>Mit einem &quot;named&quot; Semaphore sollte das aber gehen...<br />
CreateSemaphore / WaitForSingleObject / ReleaseSemaphore</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1675201</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1675201</guid><dc:creator><![CDATA[Jochen Kalmbach]]></dc:creator><pubDate>Fri, 06 Mar 2009 12:22:39 GMT</pubDate></item><item><title><![CDATA[Reply to DLL Instanzenzähler auslesen on Mon, 09 Mar 2009 10:38:02 GMT]]></title><description><![CDATA[<p>Eine noch nicht genannte Möglichkeit für einen Instanzenzähler können auch Mutex-Objekte bieten. Jede neue Instanz versucht der Reihe nach die namentlich festgelegten Mutex-Objekte einzurichten. Belegte Objekte liefern einen Fehler. Das erste freie Objekt ist dann der Instanzenzähler, den aber dann nur diese Instanz kennt. Ob dieser sehr einfache Weg ausreicht, kann ich nicht beurteilen. Für alles weitere braucht man in irgendeiner Form Shared Memory, notfalls in einer temporären Datei.<br />
Ich weiss, Mutex-Objekte sollen anderen Zwecken dienen. Da sie systemglobal sind, lassen sie ich aber durchaus auch hierfür problemlos einsetzen. Der erforderliche Aufwand ist gering.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1676560</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1676560</guid><dc:creator><![CDATA[berniebutt]]></dc:creator><pubDate>Mon, 09 Mar 2009 10:38:02 GMT</pubDate></item><item><title><![CDATA[Reply to DLL Instanzenzähler auslesen on Mon, 09 Mar 2009 10:41:43 GMT]]></title><description><![CDATA[<p>lol</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1676562</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1676562</guid><dc:creator><![CDATA[asdca]]></dc:creator><pubDate>Mon, 09 Mar 2009 10:41:43 GMT</pubDate></item><item><title><![CDATA[Reply to DLL Instanzenzähler auslesen on Mon, 09 Mar 2009 17:06:12 GMT]]></title><description><![CDATA[<p>asdca schrieb:</p>
<blockquote>
<p>lol</p>
</blockquote>
<p>Du schon wieder! Hast du nichts anderes zu tun und was heisst 'lol' - 'Lasse Opel laufen'? Mein Hinweis ist geeignet und könnte dem Fragesteller vielleicht helfen. Jedenfalls geht es!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1676902</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1676902</guid><dc:creator><![CDATA[berniebutt]]></dc:creator><pubDate>Mon, 09 Mar 2009 17:06:12 GMT</pubDate></item><item><title><![CDATA[Reply to DLL Instanzenzähler auslesen on Mon, 09 Mar 2009 17:20:13 GMT]]></title><description><![CDATA[<blockquote>
<p>Mein Hinweis ist geeignet</p>
</blockquote>
<p>nein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1676913</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1676913</guid><dc:creator><![CDATA[flasch!]]></dc:creator><pubDate>Mon, 09 Mar 2009 17:20:13 GMT</pubDate></item><item><title><![CDATA[Reply to DLL Instanzenzähler auslesen on Tue, 10 Mar 2009 17:31:41 GMT]]></title><description><![CDATA[<p>Dann probiere es oder verwende die von asdca vorgeschlagenen Funktion lol(...). Diese findet sich weder bei C noch in der WinApi.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1677521</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1677521</guid><dc:creator><![CDATA[berniebutt]]></dc:creator><pubDate>Tue, 10 Mar 2009 17:31:41 GMT</pubDate></item><item><title><![CDATA[Reply to DLL Instanzenzähler auslesen on Tue, 10 Mar 2009 19:49:45 GMT]]></title><description><![CDATA[<p>bernie du bist mir ne frisbee ey.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1677605</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1677605</guid><dc:creator><![CDATA[asdca]]></dc:creator><pubDate>Tue, 10 Mar 2009 19:49:45 GMT</pubDate></item></channel></rss>