<?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[SERVICE_CONTROL_DEVICEEVENT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich bekomme in meinem Service in der HandlerEx Funktion niemals das SERVICE_CONTROL_DEVICEEVENT.</p>
<p>Ich weiß das ich zuerst RegisterDeviceNotification ausführen muss.</p>
<p>Allerdings WILL DAS EINFACH NICHT KLAPPEN. Seit 2 Wochen versuche ich alles um das hinzukriegen. Aber er klappt nicht.</p>
<p>Ich habe ausgegeben... Ich finde keine guten Beispiele. Wenn dann nur Beispiele die bei mir nicht funktionieren oder so.<br />
Und hier im Forum kann mir dazu anscheinend keiner helfen.</p>
<p>Kennt einer von euch sonst noch ne Möglichkeit irgendwie mitzubekommen, wenn ein USB-Stick angeschlossen wird??<br />
MFG<br />
Ace</p>
<p>PS: Nochmal mein aktueller Code:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;fstream&gt;

#include &lt;Windows.h&gt;
#include &lt;winuser.h&gt;
#include &lt;lm.h&gt;
#include &lt;dbt.h&gt;
#include &lt;vcl.h&gt;
#include &lt;Tlhelp32.h&gt;
#include &lt;stdio.h&gt;
#include &lt;cstdio.h&gt;

#define DEVICE_NOTIFY_ALL_INTERFACE_CLASSES  0x00000004

using namespace std;

SERVICE_STATUS Service_status;
SERVICE_STATUS_HANDLE hService_status;

DWORD WINAPI HandlerEx(DWORD dwControl,DWORD dwEventType,LPVOID lpEventData,LPVOID lpContex)
{
   DWORD status;

   switch(dwControl)
   {
      case SERVICE_CONTROL_DEVICEEVENT:
         Beep( 750, 3000 );
         if(dwEventType == DBT_DEVICEARRIVAL)
         {
                Beep(500,3000);
         }
         break;
      case SERVICE_CONTROL_PAUSE:
      // Do whatever it takes to pause here.
         Service_status.dwCurrentState = SERVICE_PAUSED;
         break;

      case SERVICE_CONTROL_CONTINUE:
      // Do whatever it takes to continue here.
         Service_status.dwCurrentState = SERVICE_RUNNING;
         break;

      case SERVICE_CONTROL_STOP:
      // Do whatever it takes to stop here.
         Service_status.dwWin32ExitCode = 0;
         Service_status.dwCurrentState  = SERVICE_STOPPED;
         Service_status.dwCheckPoint    = 0;
         Service_status.dwWaitHint      = 0;
         SetServiceStatus (hService_status, &amp;Service_status);
         return 1;

      case SERVICE_CONTROL_INTERROGATE:
      // Fall through to send current status.
         break;
   }
   SetServiceStatus (hService_status, &amp;Service_status);

   // Send current status.

   return 1;
}

void WINAPI MyServiceStart (DWORD argc, LPTSTR *argv)
{
    DWORD status;
    DWORD specificError;

    Service_status.dwServiceType        = SERVICE_WIN32;
    Service_status.dwCurrentState       = SERVICE_START_PENDING;
    Service_status.dwControlsAccepted   = 0;
    Service_status.dwWin32ExitCode      = 0;
    Service_status.dwServiceSpecificExitCode = 0;
    Service_status.dwCheckPoint         = 0;
    Service_status.dwWaitHint           = 10000;

    hService_status = RegisterServiceCtrlHandlerEx(
        &quot;MyService&quot;,
        (LPHANDLER_FUNCTION_EX)HandlerEx,
        0);

    SetServiceStatus(hService_status, &amp;Service_status);

    // Handle error condition 
    if (status != NO_ERROR)
    {
        Service_status.dwCurrentState       = SERVICE_STOPPED; 
        Service_status.dwCheckPoint         = 0;
        Service_status.dwWaitHint           = 0; 
        Service_status.dwWin32ExitCode      = status;
        Service_status.dwServiceSpecificExitCode = specificError; 

        SetServiceStatus (hService_status, &amp;Service_status); 
        return; 
    } 

    // Initialization complete - report running status. 
    Service_status.dwCurrentState       = SERVICE_RUNNING; 
    Service_status.dwCheckPoint         = 0; 
    Service_status.dwWaitHint           = 0;
    Service_status.dwControlsAccepted   = SERVICE_ACCEPT_STOP |
        SERVICE_ACCEPT_PAUSE_CONTINUE;

    SetServiceStatus (hService_status, &amp;Service_status);
    DEV_BROADCAST_DEVICEINTERFACE NotificationFilter;
    ZeroMemory( &amp;NotificationFilter, sizeof(NotificationFilter) );
    NotificationFilter.dbcc_size = sizeof(NotificationFilter);
    NotificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
    memcpy(
        &amp;(NotificationFilter.dbcc_classguid),
        &amp;(GUID_DEVINTERFACE_CDROM),
        sizeof(GUID_DEVINTERFACE_CDROM)
    );
    HANDLE hRegister = RegisterDeviceNotification(
        &amp;Service_status,
        &amp;NotificationFilter,
        DEVICE_NOTIFY_SERVICE_HANDLE|
        DEVICE_NOTIFY_ALL_INTERFACE_CLASSES
    );
    if(hRegister==NULL)
    {
        Beep(1000,100);
        Sleep(100);
        int error = GetLastError();
        if(error==13)
        {
          Beep(1500,1000);
          Sleep(100);
          Beep(1500,1000);
        }else{
        FILE* file;
        file = fopen(&quot;C:\\mytxt.txt&quot;,&quot;w&quot;);
        fprintf(file,&quot;%d&quot;,error);
        fclose(file);

        }
    }
    return;
}

int main(int argc, char *argv[])
{
    SERVICE_TABLE_ENTRY serv_dispatchtable[]=
    {
                        {TEXT(&quot;MyService&quot;),(LPSERVICE_MAIN_FUNCTION)MyServiceStart},
                        {NULL,NULL}
    };
    StartServiceCtrlDispatcher(serv_dispatchtable);
    system(&quot;PAUSE&quot;);
    return EXIT_SUCCESS;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/180040/service_control_deviceevent</link><generator>RSS for Node</generator><lastBuildDate>Thu, 09 Jul 2026 11:10:57 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/180040.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 27 Apr 2007 21:02:53 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to SERVICE_CONTROL_DEVICEEVENT on Fri, 27 Apr 2007 21:02:53 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich bekomme in meinem Service in der HandlerEx Funktion niemals das SERVICE_CONTROL_DEVICEEVENT.</p>
<p>Ich weiß das ich zuerst RegisterDeviceNotification ausführen muss.</p>
<p>Allerdings WILL DAS EINFACH NICHT KLAPPEN. Seit 2 Wochen versuche ich alles um das hinzukriegen. Aber er klappt nicht.</p>
<p>Ich habe ausgegeben... Ich finde keine guten Beispiele. Wenn dann nur Beispiele die bei mir nicht funktionieren oder so.<br />
Und hier im Forum kann mir dazu anscheinend keiner helfen.</p>
<p>Kennt einer von euch sonst noch ne Möglichkeit irgendwie mitzubekommen, wenn ein USB-Stick angeschlossen wird??<br />
MFG<br />
Ace</p>
<p>PS: Nochmal mein aktueller Code:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;fstream&gt;

#include &lt;Windows.h&gt;
#include &lt;winuser.h&gt;
#include &lt;lm.h&gt;
#include &lt;dbt.h&gt;
#include &lt;vcl.h&gt;
#include &lt;Tlhelp32.h&gt;
#include &lt;stdio.h&gt;
#include &lt;cstdio.h&gt;

#define DEVICE_NOTIFY_ALL_INTERFACE_CLASSES  0x00000004

using namespace std;

SERVICE_STATUS Service_status;
SERVICE_STATUS_HANDLE hService_status;

DWORD WINAPI HandlerEx(DWORD dwControl,DWORD dwEventType,LPVOID lpEventData,LPVOID lpContex)
{
   DWORD status;

   switch(dwControl)
   {
      case SERVICE_CONTROL_DEVICEEVENT:
         Beep( 750, 3000 );
         if(dwEventType == DBT_DEVICEARRIVAL)
         {
                Beep(500,3000);
         }
         break;
      case SERVICE_CONTROL_PAUSE:
      // Do whatever it takes to pause here.
         Service_status.dwCurrentState = SERVICE_PAUSED;
         break;

      case SERVICE_CONTROL_CONTINUE:
      // Do whatever it takes to continue here.
         Service_status.dwCurrentState = SERVICE_RUNNING;
         break;

      case SERVICE_CONTROL_STOP:
      // Do whatever it takes to stop here.
         Service_status.dwWin32ExitCode = 0;
         Service_status.dwCurrentState  = SERVICE_STOPPED;
         Service_status.dwCheckPoint    = 0;
         Service_status.dwWaitHint      = 0;
         SetServiceStatus (hService_status, &amp;Service_status);
         return 1;

      case SERVICE_CONTROL_INTERROGATE:
      // Fall through to send current status.
         break;
   }
   SetServiceStatus (hService_status, &amp;Service_status);

   // Send current status.

   return 1;
}

void WINAPI MyServiceStart (DWORD argc, LPTSTR *argv)
{
    DWORD status;
    DWORD specificError;

    Service_status.dwServiceType        = SERVICE_WIN32;
    Service_status.dwCurrentState       = SERVICE_START_PENDING;
    Service_status.dwControlsAccepted   = 0;
    Service_status.dwWin32ExitCode      = 0;
    Service_status.dwServiceSpecificExitCode = 0;
    Service_status.dwCheckPoint         = 0;
    Service_status.dwWaitHint           = 10000;

    hService_status = RegisterServiceCtrlHandlerEx(
        &quot;MyService&quot;,
        (LPHANDLER_FUNCTION_EX)HandlerEx,
        0);

    SetServiceStatus(hService_status, &amp;Service_status);

    // Handle error condition 
    if (status != NO_ERROR)
    {
        Service_status.dwCurrentState       = SERVICE_STOPPED; 
        Service_status.dwCheckPoint         = 0;
        Service_status.dwWaitHint           = 0; 
        Service_status.dwWin32ExitCode      = status;
        Service_status.dwServiceSpecificExitCode = specificError; 

        SetServiceStatus (hService_status, &amp;Service_status); 
        return; 
    } 

    // Initialization complete - report running status. 
    Service_status.dwCurrentState       = SERVICE_RUNNING; 
    Service_status.dwCheckPoint         = 0; 
    Service_status.dwWaitHint           = 0;
    Service_status.dwControlsAccepted   = SERVICE_ACCEPT_STOP |
        SERVICE_ACCEPT_PAUSE_CONTINUE;

    SetServiceStatus (hService_status, &amp;Service_status);
    DEV_BROADCAST_DEVICEINTERFACE NotificationFilter;
    ZeroMemory( &amp;NotificationFilter, sizeof(NotificationFilter) );
    NotificationFilter.dbcc_size = sizeof(NotificationFilter);
    NotificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
    memcpy(
        &amp;(NotificationFilter.dbcc_classguid),
        &amp;(GUID_DEVINTERFACE_CDROM),
        sizeof(GUID_DEVINTERFACE_CDROM)
    );
    HANDLE hRegister = RegisterDeviceNotification(
        &amp;Service_status,
        &amp;NotificationFilter,
        DEVICE_NOTIFY_SERVICE_HANDLE|
        DEVICE_NOTIFY_ALL_INTERFACE_CLASSES
    );
    if(hRegister==NULL)
    {
        Beep(1000,100);
        Sleep(100);
        int error = GetLastError();
        if(error==13)
        {
          Beep(1500,1000);
          Sleep(100);
          Beep(1500,1000);
        }else{
        FILE* file;
        file = fopen(&quot;C:\\mytxt.txt&quot;,&quot;w&quot;);
        fprintf(file,&quot;%d&quot;,error);
        fclose(file);

        }
    }
    return;
}

int main(int argc, char *argv[])
{
    SERVICE_TABLE_ENTRY serv_dispatchtable[]=
    {
                        {TEXT(&quot;MyService&quot;),(LPSERVICE_MAIN_FUNCTION)MyServiceStart},
                        {NULL,NULL}
    };
    StartServiceCtrlDispatcher(serv_dispatchtable);
    system(&quot;PAUSE&quot;);
    return EXIT_SUCCESS;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1274872</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1274872</guid><dc:creator><![CDATA[AceKiller73]]></dc:creator><pubDate>Fri, 27 Apr 2007 21:02:53 GMT</pubDate></item><item><title><![CDATA[Reply to SERVICE_CONTROL_DEVICEEVENT on Fri, 27 Apr 2007 22:41:50 GMT]]></title><description><![CDATA[<p>Leider krieg ich das nicht kompiliert,</p>
<p>aber</p>
<p>im MSDN steht zu lesen</p>
<blockquote>
<p>HDEVNOTIFY RegisterDeviceNotification(<br />
HANDLE hRecipient,<br />
LPVOID NotificationFilter,<br />
DWORD Flags<br />
);</p>
<p>Parameters<br />
hRecipient<br />
[in] Handle to the window or service that will receive device events for the devices specified in the NotificationFilter parameter. The same window handle can be used in multiple calls to RegisterDeviceNotification.<br />
Services can specify either a window handle or <strong>service status handle</strong>.</p>
</blockquote>
<p>In Deinem Code aber</p>
<pre><code class="language-cpp">SERVICE_STATUS Service_status;
SERVICE_STATUS_HANDLE hService_status;

//...

    HANDLE hRegister = RegisterDeviceNotification(
        &amp;Service_status,
        &amp;NotificationFilter,
        DEVICE_NOTIFY_SERVICE_HANDLE|
        DEVICE_NOTIFY_ALL_INTERFACE_CLASSES
    );
</code></pre>
<p>Übergib dem Systemruf vielleicht mal hService_status.</p>
<p>Ansonsten könnten Testausschiften mittels</p>
<pre><code class="language-cpp">OutputDebugString()
</code></pre>
<p>in HandlerEx(...) helfen.</p>
<p>Oder halt mal via Taskmanager in den laufenden Dienst &quot;reindebuggen&quot;.</p>
<p>Grüsse</p>
<p>Gast++</p>
<p>P.S.:Btw. mir fällt auf dass fast alle gespostetn Codebeispiele, also auch die in anderen Threads) nicht mit UNICODE laufen. Bei mir ( VC Express ) musste ich extra MBCS auswählen; bei Dir nicht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1274901</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1274901</guid><dc:creator><![CDATA[Gast++]]></dc:creator><pubDate>Fri, 27 Apr 2007 22:41:50 GMT</pubDate></item><item><title><![CDATA[Reply to SERVICE_CONTROL_DEVICEEVENT on Sun, 29 Apr 2007 09:34:13 GMT]]></title><description><![CDATA[<p>Erst mal vieeeeeeleeeeen Dank.<br />
Bin echt nicht mehr weitergekommen. Obwohl das nur so kleiner dummer Fehler war.</p>
<p>Jetzt bekomme ich immerhin keine Fehlermeldung for RegisterDeviceNotification.</p>
<p>Im Moment funzt. das mit der GUID noch nicht aber da werd ich nochma gucken.</p>
<p>MFG<br />
Ace</p>
<p>PS:Benutze den BCB und ich hab da nix mit MBCS ausgewählt weiß auch gar nicht wie ich das da mache.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1275533</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1275533</guid><dc:creator><![CDATA[AceKiller73]]></dc:creator><pubDate>Sun, 29 Apr 2007 09:34:13 GMT</pubDate></item><item><title><![CDATA[Reply to SERVICE_CONTROL_DEVICEEVENT on Sun, 29 Apr 2007 11:15:39 GMT]]></title><description><![CDATA[<p>Gast++ schrieb:</p>
<blockquote>
<p>P.S.:Btw. mir fällt auf dass fast alle gespostetn Codebeispiele, also auch die in anderen Threads) nicht mit UNICODE laufen. Bei mir ( VC Express ) musste ich extra MBCS auswählen; bei Dir nicht?</p>
</blockquote>
<p>Jops, das ist leider bei fast allen so...liegt daran, dass die wenigsten hier auf Zeichensatz-unabhängige Typen achten (<em>TCHAR</em>, <em>TEXT</em>-Makro, ...).<br />
Bei dem obrigen Code ist es das Gleiche <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /> .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1275570</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1275570</guid><dc:creator><![CDATA[CodeFinder]]></dc:creator><pubDate>Sun, 29 Apr 2007 11:15:39 GMT</pubDate></item><item><title><![CDATA[Reply to SERVICE_CONTROL_DEVICEEVENT on Sun, 29 Apr 2007 13:55:14 GMT]]></title><description><![CDATA[<p>AceKiller73 schrieb:</p>
<blockquote>
<p>Erst mal vieeeeeeleeeeen Dank.</p>
</blockquote>
<p>You're welcome! <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>
<p>AceKiller73 schrieb:</p>
<blockquote>
<p>Im Moment funzt. das mit der GUID noch nicht aber da werd ich nochma gucken.</p>
</blockquote>
<p>Welche GUID ?<br />
GUID_DEVINTERFACE_CDROM?<br />
Mit dem Ding wär ich vorsichtig; das schein ein Makro zu sein.</p>
<p>Vielleicht &amp;GUID_DEVINTERFACE_CDROM statt &amp;(GUID_DEVINTERFACE_CDROM)?<br />
( Schuss ins Blaue auf bewusst unsicherer Grundlage <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>
<p>Das wäre auch von MS gar nicht nett...</p>
<p>AceKiller73 schrieb:</p>
<blockquote>
<p>PS:Benutze den BCB und ich hab da nix mit MBCS ausgewählt weiß auch gar nicht wie ich das da mache.</p>
</blockquote>
<p>Den Compiler kenn ich nicht aber ein</p>
<pre><code class="language-cpp">#undef _MBCS
#undef MBCS
#define _UNICODE 1
#define UNICODE 1
#include &lt;tchar.h&gt;
</code></pre>
<p>vor dem ersten #include sollte den Zweck erfüllen.<br />
Gibt wahrschinelich ein paar Fehlermeldungen weil irgendwo &quot;const char*&quot; statt TEXT(const char*) oder _T(const char*) verwandt wird.<br />
Kannst ja mal testen</p>
<p>_tprintf(_T(&quot;sizeof TCHAR ist: %i\n&quot;),sizeof(TCHAR));</p>
<p>und zur Not wieder auskommentieren<br />
(2 sollte herauskommen)</p>
<p>Aber hier könnte es wirklich wchtig sein, da der <strong>NT-Kernel</strong> sonst bei Systemrufen afaik immer implzit konvertieren muss.<br />
So täts der <strong>Compiler</strong> _vor_ der Laufzeit des Prog.</p>
<p>Grüsse</p>
<p>*this</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1275686</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1275686</guid><dc:creator><![CDATA[Gast++]]></dc:creator><pubDate>Sun, 29 Apr 2007 13:55:14 GMT</pubDate></item></channel></rss>