<?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[Globale Variablen in Hook-Funktion verwenden]]></title><description><![CDATA[<p>Ich habe eine DLL geschrieben die einen Haken bei Windows einhängt um Botschaften vom Mixer-Device abzufangen, und dann darauf zu reagieren. Nun möchte ich aber in der von Windows aufgerufenen Hook-Funktion Variablen verwenden die ich vorm setzen des Hooks an die DLL übergeben habe.</p>
<p>Allerdings sind die in der DLL global definierten Variablen dann ständig NULL.<br />
Das liegt wahrscheinlich daran, daß jedesmal wenn die Hook-Funktion aufgerufen wird, dafür ein neuer Adressraum angelegt wird.(Denke ich <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /> )</p>
<p>Wie könnte man der Hookfunktion sonst die Variablen oder deren Adressen mitteilen???</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/76190/globale-variablen-in-hook-funktion-verwenden</link><generator>RSS for Node</generator><lastBuildDate>Sat, 11 Apr 2026 10:20:17 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/76190.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 08 Jun 2004 15:45:25 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Globale Variablen in Hook-Funktion verwenden on Tue, 08 Jun 2004 15:45:25 GMT]]></title><description><![CDATA[<p>Ich habe eine DLL geschrieben die einen Haken bei Windows einhängt um Botschaften vom Mixer-Device abzufangen, und dann darauf zu reagieren. Nun möchte ich aber in der von Windows aufgerufenen Hook-Funktion Variablen verwenden die ich vorm setzen des Hooks an die DLL übergeben habe.</p>
<p>Allerdings sind die in der DLL global definierten Variablen dann ständig NULL.<br />
Das liegt wahrscheinlich daran, daß jedesmal wenn die Hook-Funktion aufgerufen wird, dafür ein neuer Adressraum angelegt wird.(Denke ich <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /> )</p>
<p>Wie könnte man der Hookfunktion sonst die Variablen oder deren Adressen mitteilen???</p>
]]></description><link>https://www.c-plusplus.net/forum/post/536148</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/536148</guid><dc:creator><![CDATA[hahgeh]]></dc:creator><pubDate>Tue, 08 Jun 2004 15:45:25 GMT</pubDate></item><item><title><![CDATA[Reply to Globale Variablen in Hook-Funktion verwenden on Thu, 10 Jun 2004 07:53:13 GMT]]></title><description><![CDATA[<p>Vielleicht sollte ich mich etwas konkreter ausdrücken.<br />
Also ersmal Quelltext:</p>
<pre><code class="language-cpp">#include &lt;vcl.h&gt;
#include &lt;windows.h&gt;
#include &lt;Mmsystem.h&gt;
#pragma hdrstop

#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
        return 1;
}

HMIXER hmx = 0;
MMRESULT result;
UINT mid = 0;
bool fix=false;
DWORD globValueMaster, globValueWave, globValueLineIn;
void setVolume(DWORD value, DWORD line);
HHOOK   hHook;   /* Handle auf die Hook-Funktion */

LRESULT CALLBACK Hook(int nCode, WPARAM wParam, LPARAM lParam)
{
  if(nCode==HC_ACTION){
         MSG *pMsg=(MSG*)lParam;
         if(pMsg-&gt;message == MM_MIXM_CONTROL_CHANGE){
             setVolume(globValueMaster, MIXERLINE_COMPONENTTYPE_DST_SPEAKERS);// die 3 glob... Variablen
             setVolume(globValueWave, MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT);//sind hier
             setVolume(globValueLineIn, MIXERLINE_COMPONENTTYPE_SRC_LINE);//immer 0
         }
  return 1;
  }
  return CallNextHookEx(hHook, nCode, wParam, lParam);
}

extern &quot;C&quot; __declspec (dllexport) unsigned long MXOpen(unsigned int valueMaster,
                           unsigned int valueWave, unsigned int valueLineIn,
                           char mask)
{
  HMODULE mh=GetModuleHandle(&quot;Project2.dll&quot;);
  result = mixerOpen(&amp;hmx, mid, (DWORD)(UINT)Application-&gt;Handle, 0L, CALLBACK_WINDOW);
  if(mask &amp; 1){
    setVolume((DWORD)valueMaster, MIXERLINE_COMPONENTTYPE_DST_SPEAKERS);
    globValueMaster=valueMaster;
  }
  if(mask &amp; 2){
    setVolume((DWORD)valueWave, MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT);
    globValueWave=valueWave;
  }
  if(mask &amp; 4){
    setVolume((DWORD)valueLineIn, MIXERLINE_COMPONENTTYPE_SRC_LINE);
    globValueLineIn=valueLineIn;
  }

  fix=true;
  HOOKPROC  lpHook;
  //	lpHook = (HOOKPROC)GetProcAddress(hDLL, &quot;Hook&quot;);
  hHook = SetWindowsHookEx(WH_GETMESSAGE, (HOOKPROC)Hook, mh, 0);

return (unsigned long)hHook;
}

void setVolume(DWORD value, DWORD line){
        MIXERCONTROLDETAILS mcd={0};
	MIXERCONTROLDETAILS_UNSIGNED mcdu={0};

        MIXERLINE ml = {0};
        ml.cbStruct = sizeof(MIXERLINE);
        if (line == MIXERLINE_COMPONENTTYPE_SRC_LINE){
          ml.dwComponentType = MIXERLINE_COMPONENTTYPE_DST_WAVEIN;
          mixerGetLineInfo((HMIXEROBJ) hmx, &amp;ml, MIXER_GETLINEINFOF_COMPONENTTYPE);
          unsigned long maxSources=ml.cConnections;
          unsigned int i=0;
          while(i&lt;maxSources &amp;&amp; ml.dwComponentType != MIXERLINE_COMPONENTTYPE_SRC_LINE){
            ml.dwSource=i;
            mixerGetLineInfo((HMIXEROBJ) hmx, &amp;ml, MIXER_GETLINEINFOF_SOURCE);
            i++;
          }
        }
        else{
          ml.dwComponentType = line;
          result = mixerGetLineInfo((HMIXEROBJ) hmx, &amp;ml, MIXER_GETLINEINFOF_COMPONENTTYPE);
        }

        MIXERLINECONTROLS mlc = {0};
        MIXERCONTROL mc = {0};
        mlc.cbStruct = sizeof(MIXERLINECONTROLS);
        mlc.dwLineID = ml.dwLineID;
        mlc.dwControlType = MIXERCONTROL_CONTROLTYPE_VOLUME;
        mlc.cControls = 1;
        mlc.pamxctrl = &amp;mc;
        mlc.cbmxctrl = sizeof(MIXERCONTROL);
        result = mixerGetLineControls((HMIXEROBJ) hmx, &amp;mlc, MIXER_GETLINECONTROLSF_ONEBYTYPE);

	mcd.cbStruct = sizeof(MIXERCONTROLDETAILS);
	mcd.dwControlID = mc.dwControlID;
	mcd.cChannels = 1;
	mcd.hwndOwner = 0;
	mcd.cbDetails = sizeof(MIXERCONTROLDETAILS_UNSIGNED);
	mcd.paDetails = &amp;mcdu;

	mcdu.dwValue =value;
        result=	mixerSetControlDetails((HMIXEROBJ) hmx, &amp;mcd, MIXER_SETCONTROLDETAILSF_VALUE);

}

extern &quot;C&quot; __declspec (dllexport) int MXClose(unsigned long handle)
{
  fix=false;
  UnhookWindowsHookEx((HHOOK)handle);
  return mixerClose(hmx);
}
</code></pre>
<p>Die 3 Variablen sind da beim ausführen immer 0. Beim debuggen allerdings nicht.<br />
Hat jemand mehr Ahnung als ich, die Funktion setVolume() findet er doch auch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/537227</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/537227</guid><dc:creator><![CDATA[hahgeh]]></dc:creator><pubDate>Thu, 10 Jun 2004 07:53:13 GMT</pubDate></item><item><title><![CDATA[Reply to Globale Variablen in Hook-Funktion verwenden on Thu, 10 Jun 2004 11:59:37 GMT]]></title><description><![CDATA[<p>Mit MSVC++ kannst du ein Datensegment mit jeder Instanz der DLL teilen. siehe <a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore/html/_core_how_do_i_share_data_in_my_dll_with_an_application_or_with_other_dlls.3f.asp" rel="nofollow">http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore/html/_core_how_do_i_share_data_in_my_dll_with_an_application_or_with_other_dlls.3f.asp</a><br />
Tipp:<br />
Sag dem Linker auch über eine Präprozessoranweisung Bescheid:</p>
<pre><code class="language-cpp">//---------------
//  shared data
//---------------
#pragma data_seg(&quot;Shared&quot;)
HHOOK hHook=NULL;
#pragma data_seg()
#pragma comment(linker, &quot;/section:Shared,RWS&quot;)
</code></pre>
<p>PS: im o.a. Link wird auch eine Alternative mit Memory Mapped Files erwähnt</p>
]]></description><link>https://www.c-plusplus.net/forum/post/537385</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/537385</guid><dc:creator><![CDATA[D*niel *chumann]]></dc:creator><pubDate>Thu, 10 Jun 2004 11:59:37 GMT</pubDate></item><item><title><![CDATA[Reply to Globale Variablen in Hook-Funktion verwenden on Thu, 10 Jun 2004 19:21:24 GMT]]></title><description><![CDATA[<p>Danke das hat mir sehr geholfen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /><br />
Ich mußte das zwar noch etwas auf <em>Borland</em> abstimmen, aber jetzt läufts super.<br />
Ich habe im Netz nachgeschaut und es so ähnlich wie dort gelöst.</p>
<p>Diese Dateien dem Projekt mit hinzugefügt und die SharedData.h inluded:</p>
<p>SharedData.cpp:</p>
<pre><code class="language-cpp">#pragma option -zR_SHSEG
#pragma option -zT_SHCLASS

#include &quot;windows.h&quot;

HHOOK   hHook=NULL;   /* Handle auf die Hook-Funktion */
DWORD globValueMaster=0;
DWORD globValueWave=0;
DWORD globValueLineIn=0;
</code></pre>
<p>SharedData.h:</p>
<pre><code class="language-cpp">extern HHOOK   hHook;
extern DWORD globValueMaster;
extern DWORD globValueWave;
extern DWORD globValueLineIn;
</code></pre>
<p>Shared.def:</p>
<pre><code class="language-cpp">LIBRARY      PROJECT2

SEGMENTS
	_SHSEG CLASS '_SHCLASS' SHARED
</code></pre>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/537697</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/537697</guid><dc:creator><![CDATA[hahgeh]]></dc:creator><pubDate>Thu, 10 Jun 2004 19:21:24 GMT</pubDate></item></channel></rss>