Announcement

Collapse
No announcement yet.

API-Funktionen verwenden die nicht im Header stehen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • API-Funktionen verwenden die nicht im Header stehen

    Hallo,

    ich möchte mein Programm als Service registrieren damit es nicht mehr in der Taskliste angezeigt wird.

    Die Deklarationssyntax habe ich in VB im Netz gefunden
    Declare Function RegisterServiceProcess Lib "kernel32" (ByVal dwProcessID As Long, ByVal dwType As Long) As Long
    und die Funktion schon in verschiedenen anderen Sprachen (u. a. Delphi) erfolgreich verwendet. Da die Funktion aber scheinbar nicht in den von Borland mitgelieferten Headern deklariert ist möchte ich das selbst tun und wäre dankbar wenn mir jemand die dafür notwendige Syntax mitteilen könnte.

    Vielen Dank im Vorraus Jörn

  • #2
    Diese Funktion existiert NUR in Win95, also Vorsicht. Du müsstest sie mit einem Export separat importieren.

    Gruß Hage

    Comment


    • #3
      Die Funktion existiert in der Kernel32.dll von Win98 ebenfalls. Aber ich kann sie nicht wie andere API-Funktionen direkt in meinen Quelltext schreiben nachdem ich windows.h in die include-Liste aufgenommen habe.
      Bitte erkläre mir wie ich die Funktion mit einem Export importieren kann. Eine möglichst einfache Erläuterung wäre hilfreich da meine C++ Kenntnisse noch nicht besonders gut sind.

      Ich habe hier im Forum etwas gefunden das wie folgt aussieht:
      extern "C" {
      #endif BOOL __declspec (dllexport) DoImport(HWND hwnd,const char * lpDatabasename,const char *lpDataPath ) ; #ifdef __cplusplus
      };
      #endif

      Könnte mir so etwas vielleicht weiterhelfen?

      Gruß Jörn

      @Hagen Vielen Dank für die schnelle Antwort

      Comment


      • #4
        <pre><p><b>unit</b> WinSvc9x;
        <p>
        <b>interface</b>
        <p>
        <b>uses</b>
        Windows;
        <p>
        <b>function</b> RegisterServiceProcess(dwProcessId, dwServiceType: DWORD): Boolean; <b>stdcall</b>;
        <p>
        <b>const</b>
        RSP_UNREGISTER_SERVICE = $00000000;
        RSP_SIMPLE_SERVICE = $00000001;
        <p>
        <b>implementation</b>
        <p>
        <b>type</b>
        TFNRegisterServiceProcess = <b>function</b>(dwProcessId, dwServiceType: DWORD): Boolean; <b>stdcall</b>;
        <p>
        <b>var</b>
        FNRegisterServiceProcess: TFNRegisterServiceProcess = <b>nil</b>;
        <p>
        <b>function</b> RegisterServiceProcess(dwProcessId, dwServiceType: DWORD): Boolean; <b>stdcall</b>;
        <b>begin</b>
        Result := False;
        <b>if not</b> Assigned(FNRegisterServiceProcess) <b>then</b>
        FNRegisterServiceProcess := TFNRegisterServiceProcess(
        GetProcAddress(GetModuleHandle('KERNEL32.DLL'), 'RegisterServiceProcess'));
        <b>if not</b> Assigned(FNRegisterServiceProcess) <b>then</b>
        SetLastError(ERROR_CALL_NOT_IMPLEMENTED)
        <b>else</b>
        Result := FNRegisterServiceProcess(dwProcessId, dwServiceType);
        <b>end</b>;
        <p>
        <b>end</b>.<p></pre>

        Unit WinSvc9x in uses aufnehmen und RegisterServiceProcess wie vorgesehen verwenden (wird dynamisch gebunden, da die Funktion unter WinNT nicht existiert).

        - nic

        Comment


        • #5
          <pre><p><font color='blue'>////////////////////////////////////////////////////////////////////////////////
          // WinSvc9x.cpp</font>
          <p>
          <font color='green'>#include "winsvc9x.hpp"</font>
          <p>
          <b>namespace</b> Winsvc9x
          {
          <p>
          <b>typedef</b> DWORD (WINAPI *PREGISTERSERVICEPROCESS)(DWORD, DWORD);
          <p>
          PREGISTERSERVICEPROCESS fnRegisterServiceProcess = NULL;
          <p>
          DWORD RegisterServiceProcess(DWORD dwProcessId, DWORD dwServiceType)
          {
          <b>if</b> (NULL == fnRegisterServiceProcess)
          fnRegisterServiceProcess = (PREGISTERSERVICEPROCESS)
          ::GetProcAddress(::GetModuleHandle(
          TEXT(<font color='blue'>"KERNEL32.DLL"</font>)), <font color='blue'>"RegisterServiceProcess"</font>);
          <b>if</b> (NULL == fnRegisterServiceProcess)
          {
          ::SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
          <b>return</b> 0;
          }
          <b>return</b> fnRegisterServiceProcess(dwProcessId, dwServiceType);
          }
          <p>
          } <font color='blue'>// namespace Winsvc9x</font>
          <p></pre>
          <pre><p><font color='blue'>////////////////////////////////////////////////////////////////////////////////
          // WinSvc9x.hpp</font>
          <p>
          <font color='green'>#ifndef _WINSVC9X_
          #define _WINSVC9X_
          <p>
          #include <windows.h></font>
          <p>
          <b>namespace</b> Winsvc9x
          {
          <p>
          DWORD
          RegisterServiceProcess(
          DWORD dwProcessId,
          DWORD dwServiceType
          );
          <p>
          <font color='green'>#define RSP_UNREGISTER_SERVICE 0x00000000
          #define RSP_SIMPLE_SERVICE 0x00000001</font>
          <p>
          } <font color='blue'>// namespace Winsvc9x</font>
          <b>using namespace</b> Winsvc9x;
          <p>
          <font color='green'>#endif</font> <font color='blue'>// _WINSVC9X_</font><p></pre>
          <pre><p><font color='blue'>////////////////////////////////////////////////////////////////////////////////
          // Sample</font>
          <p>
          <b>if</b> ((0 == Winsvc9x::RegisterServiceProcess(0, RSP_UNREGISTER_SERVICE)) &&
          (ERROR_CALL_NOT_IMPLEMENTED == ::GetLastError()))
          {
          ::MessageBox(NULL, TEXT(<font color='blue'>"RegisterServiceProcess unsupported."</font>), NULL, 0);
          }<p></pre>

          - nic

          Comment


          • #6
            Du kannst allerdings auch die Delphi-Version importieren...

            <pre><p><b>unit</b> WinSvc9x;
            <p>
            <b>interface</b>
            <p>
            <b>uses</b>
            Windows;
            <p>
            <b>function</b> RegisterServiceProcess(dwProcessId, dwServiceType: DWORD): DWORD;
            <p>
            <b>const</b>
            RSP_UNREGISTER_SERVICE = $00000000;
            RSP_SIMPLE_SERVICE = $00000001;
            <p>
            <b>implementation</b>
            <p>
            <b>type</b>
            TFNRegisterServiceProcess = <b>function</b>(dwProcessId, dwServiceType: DWORD): DWORD; <b>stdcall</b>;
            <p>
            <b>var</b>
            FNRegisterServiceProcess: TFNRegisterServiceProcess = <b>nil</b>;
            <p>
            <b>function</b> RegisterServiceProcess(dwProcessId, dwServiceType: DWORD): DWORD;
            <b>begin</b>
            Result := 0;
            <b>if not</b> Assigned(FNRegisterServiceProcess) <b>then</b>
            FNRegisterServiceProcess := TFNRegisterServiceProcess(
            GetProcAddress(GetModuleHandle(<font color='blue'>'KERNEL32.DLL'</font>), <font color='blue'>'RegisterServiceProcess'</font>));
            <b>if not</b> Assigned(FNRegisterServiceProcess) <b>then</b>
            SetLastError(ERROR_CALL_NOT_IMPLEMENTED)
            <b>else</b>
            Result := FNRegisterServiceProcess(dwProcessId, dwServiceType);
            <b>end</b>;
            <p>
            <b>end</b>.<p></pre>

            - nico
            &#10

            Comment

            Working...
            X