Announcement

Collapse
No announcement yet.

MSDN-Artikel

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

  • MSDN-Artikel

    Hallo !
    habe in der MSDN folgenden Artikel gefunden. Jedoch ist das in C++ geschrieben. Könnte mir jemand erklären, wie ich das nach Delphi konvertieren kann. Speziell die RPC-Funktionen, denn die kann ich in Delphi nicht finden.

    int
    UserMessageBox(
    RPC_BINDING_HANDLE h,
    LPSTR lpszWindowStation,
    LPSTR lpszDesktop,
    LPSTR lpszText,
    LPSTR lpszTitle,
    UINT fuStyle)
    {
    DWORD dwThreadId;
    HWINSTA hwinstaSave;
    HDESK hdeskSave;
    HWINSTA hwinstaUser;
    HDESK hdeskUser;
    int result;

    // Ensure connection to service window station and desktop, and
    // save their handles.

    GetDesktopWindow();
    hwinstaSave = GetProcessWindowStation();
    dwThreadId = GetCurrentThreadId();
    hdeskSave = GetThreadDesktop(dwThreadId);

    // Impersonate the client and connect to the User's
    // window station and desktop.

    RpcImpersonateClient(h);
    hwinstaUser = OpenWindowStation(lpszWindowStation, FALSE, MAXIMUM_ALLOWED);
    if (hwinstaUser == NULL)
    {
    RpcRevertToSelf();
    return 0;
    }
    SetProcessWindowStation(hwinstaUser);
    hdeskUser = OpenDesktop(lpszDesktop, 0, FALSE, MAXIMUM_ALLOWED);
    RpcRevertToSelf();
    if (hdeskUser == NULL)
    {
    SetProcessWindowStation(hwinstaSave);
    CloseWindowStation(hwinstaUser);
    return 0;
    }
    SetThreadDesktop(hdeskUser);

    // Display message box.

    dwGuiThreadId = dwThreadId;
    result = MessageBox(NULL, lpszText, lpszTitle, fuStyle);
    dwGuiThreadId = 0;

    // Restore window station and desktop.

    SetThreadDesktop(hdeskSave);
    SetProcessWindowStation(hwinstaSave);
    CloseDesktop(hdeskUser);
    CloseWindowStation(hwinstaUser);

    return result;
    }

  • #2
    Hallo Sascha,<br>
    <br>
    wenn ich das richtig sehe ist das das Beispiel:<br>
    <b>Interacting with the User in a Service</b><br>
    aus dem SDK.<br>
    Ich habe mir jetzt nicht alle verwendeten Funktionen angesehen, aber beispielsweise ist RpcImpersonateClient<br>
    in der RPC.H deklariert. Diese Funktion wird aus der RPCRT4.DLL exportiert.<br>
    Solltest Du über das SDK verfügen, kannst Du Dir dort für jede Funktion heraussuchen,<br>
    in welcher Header Datei sie deklariert ist, und aus welcher DLL sie exportiert wird.<br>
    Sollte der Name der Header oder DLL Datei mit einer Unit aus Delphi übereinstimmen, so ist die Chance<br>
    gross, dass die gewünschte Funktion in Delphi zur Verfügung steht, und dass sie nur noch der Uses<br>
    Anweisung hinzugefügt werden muss.<br>
    Das gilt nicht nur für Funktionen, sondern auch für Typ- und Konstantendeklarationen.<br>
    Ansonsten heisst es die Headerdateien durchgehen und die Deklarationen heraussuchen.<br>
    In der Regel kannst Du davon ausgehen, dass sämtliche Datentypen, die in C als Handle (z.B. HDESK)<br>
    genutzt werden, in Delphi als DWord (oder auch Handle) definiert werden müssen (können).<br>
    lpsz... ist normalerweise durch PChar zu ersetzen.<br>
    Bei anderen Typen (UINT, INT) sind diese schon in Delphi bekannt, meist in der Unit Windows.<br>
    Wie Du wohl schon erkannt hast, wird in C erst der Typ, und dann der Variablenname angegeben, also<br>
    umgekehrt wie in Delphi. Zuweisungen erfolgen mit = statt mit :=, und Gleichheit wird mit == statt =<br>
    abgeprüft. Steht vorher ein ! so entspricht dass dem NOT in Delphi, und {} Kombinationen sind das<br>
    Gegenstück zu begin/end.<br>
    <br>
    Ein Bespiel:<br>
    function RpcImpersonateClient(const h : DWord) : DWord; stdcall; external 'rpcrt4.dll' name 'RpcImpersonateClient';<br>
    <br>
    Dieses Beispiel habe ich jetzt zwar noch nicht getestet, dürfte aber stimmen.<br>
    Die beiden DWord's sind mehr geraten, denn bei den RPC Headern (es gibt einige) gehen die<br>
    Deklarationen ziemlich kreuz und quer.<br>
    Hierbei sind besonders wichtig:<br>
    stdcall, damit die Parameter korrekt übergeben werden<br>
    auf Gross-/Kleinschreibung des Funktionsnamens zu achten.<br>
    <br>
    Ich hoffe, dass Dir das erst einmal weiterhilft.<br>
    <br>
    Ciao<br>
    Chris
    <br>
    PS: Was ich noch vergessen hatte: Wird in C bei der Angabe eines Pointers NULL angegeben,<br>
    so ist das in Delphi durch NIL zu ersetzen.<br&gt

    Comment


    • #3
      Ach, eins noch:<br>
      Solltest Du einmal für eine API Funktion eine Callback Funktion benötigen, so muss auch diese<br>
      mit stdcall deklariert werden. (z.B. Callback für EnumWindows)<br&gt

      Comment


      • #4
        Danke für die ausführliche Hilfestellung. Eine Frage habe ich jedoch noch. Der Parameter "RPC_BINDING_HANDLE h", der ja auch von der Funktion "RpcImpersonateClient" erwartet wird ist mir noch nicht klar geworden. Ich weiss einfach nicht wie dieser Parameter ausschauen muss. Die MSDN hilft mir da auch nicht weiter. "RPC_BINDING_HANDLE" ist ja ein Datentyp, wenn ich mich nicht irre, aber ich habe keine Ahnung, was für ein Wert dann in der variablen h stehen muss. Hoffe Du kannst mir da nochmal helfen.

        Danke
        Sasch

        Comment


        • #5
          Hallo Sascha,<br>
          <br>
          sorry, aber was ein BindingHandle ist, kann ich Dir leider nicht erklären, da ich es selber nicht weiss.<br>
          Mit den gesamten RPC Funktionen habe ich mich bislang noch nie beschäftigt.<br>
          Vielleicht findet sich ja noch jemand hier im Forum, der das erläutern kann.<br>
          <br>
          Ciao<br>
          Chri

          Comment


          • #6
            Das wäre nicht schlecht. Da stehe ich nämlich auf dem Schlauch.

            Gruss
            Sasch

            Comment


            • #7
              Ein Binding-Handle ist sicher ein Handle zu einem Binding-Lager ... )<br>
              In der zitierten MSDN steht die Lösung dazu:<br>
              <i>A binding handle is a pointer-sized opaque variable containing information that the RPC run-time library uses to access binding information. The run-time library uses binding information to establish a client-server relationship that allows the execution of remote procedure calls. ...</i><br><br>usw.<br><br>
              Mathias

              Comment


              • #8
                Aha,
                hört sich ja ganz gut an. Könntest Du vielleicht noch ein Beispiel posten, wie man an so ein Handle kommt ?

                Gruss
                Sasch

                Comment

                Working...
                X