AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Windows MBN API für Delphi XE portieren
Thema durchsuchen
Ansicht
Themen-Optionen

Windows MBN API für Delphi XE portieren

Ein Thema von synAIRgy · begonnen am 10. Jul 2016 · letzter Beitrag vom 12. Apr 2019
Antwort Antwort
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.075 Beiträge
 
Delphi 10.4 Sydney
 
#1

AW: Windows MBN API für Delphi XE portieren

  Alt 12. Jul 2016, 12:50
Beim Anfang stolpere ich auch ein bisschen, aber das überlasse ich mal deiner Fantasie und Können.

Delphi-Quellcode:
program MBNConsole;

{$APPTYPE CONSOLE}

{$R *.res}


uses
  System.SysUtils,
  Winapi.Windows,
  Winapi.Messages,
  System.Variants,
  System.Classes,
  Winapi.ActiveX,
  MbnApi_TLB;

type
  TConnectionEventsSink = class(TInterfacedObject, IMbnConnectionEvents)

  public
    function OnConnectComplete(const newConnection: IMbnConnection; requestID: Cardinal; status: HRESULT): HRESULT; stdcall;
    function OnConnectStateChange(const newConnection: IMbnConnection): HRESULT; stdcall;
    function OnDisconnectComplete(const newConnection: IMbnConnection; requestID: Cardinal; status: HRESULT): HRESULT; stdcall;
    function OnVoiceCallStateChange(const newConnection: IMbnConnection): HRESULT; stdcall;

  end;

function TConnectionEventsSink.OnConnectComplete(const newConnection: IMbnConnection; requestID: Cardinal;
  status: HRESULT): HRESULT;
begin
  WriteLn('OnConnectComplete');
end;

function TConnectionEventsSink.OnConnectStateChange(const newConnection: IMbnConnection): HRESULT;
var
  activationState: MBN_ACTIVATION_STATE;
  profileName: WideString;
begin
  newConnection.GetConnectionState(activationState, profileName);
  WriteLn('OnConnectStateChange - ' + profileName + ' - ' + Cardinal(activationState).ToString);
end;

function TConnectionEventsSink.OnDisconnectComplete(const newConnection: IMbnConnection; requestID: Cardinal;
  status: HRESULT): HRESULT;
begin
  WriteLn('OnDisconnectComplete');
end;

function TConnectionEventsSink.OnVoiceCallStateChange(const newConnection: IMbnConnection): HRESULT;
begin
  WriteLn('OnVoiceCallStateChange');
end;

procedure Main;
var
  HR: HRESULT;
  mbnInfMgr: TMbnInterfaceManager;
  ConnectionEnum: IEnumConnectionPoints;
  infMgr: IMbnInterfaceManager;
  interfaces: PSafeArray;
  inf: IMbnInterface;
  MbnInterfaceManager: IMbnInterfaceManager;
  mbnConnMgr: TMbnConnectionManager;
  conMgr: IMbnConnectionManager;
  icpc: IConnectionPointContainer;
  icp: IConnectionPoint;
  connEvtsSink: IUnknown;
  cookie, requestID: UINT;
  conn: IMbnConnection;
begin
  mbnInfMgr := TMbnInterfaceManager.Create(nil);

  if Supports(mbnInfMgr.DefaultInterface, IMbnInterfaceManager, infMgr) then
  begin
    // das schlägt bei mir fehlt, hier ist guter Rat teuer
    HR := infMgr.GetInterfaces(interfaces);
    if HR = S_OK then
    begin
// inf := IMbnInterface(interfaces.rgsabound[0]);
    end
    else
    begin
      RaiseLastOSError(HR);
    end;
  end;

  mbnConnMgr := TMbnConnectionManager.Create(nil);

  icpc := mbnConnMgr.DefaultInterface;
  if Supports(icpc, IMbnConnectionManager, conMgr) then
  begin
    if icpc.FindConnectionPoint(IID_IMbnConnectionEvents, icp) = S_OK then
    begin
      connEvtsSink := TConnectionEventsSink.Create;
      icp.Advise(connEvtsSink, cookie);
    end;
  end;

  // Make sure the radio is turned on before here
  requestID := 0;
  if Assigned(inf) and (inf.GetConnection(conn) = S_OK) then
  begin
    // CONNECT HERE - AND WAIT FOR EVENTS
    WriteLn(' Connect - wait for events ');
    conn.Connect(MBN_CONNECTION_MODE_PROFILE, 'voda UK', requestID);
    WriteLn(' requestID:' + requestID.ToString);
    // WAIT 60 SECONDS FOR EVENTS TO FIRE
    Sleep(60000);
    WriteLn(' Disconnect - wait for events ');
    conn.Disconnect(requestID);
    WriteLn(' requestID:' + requestID.ToString);
  end;

  mbnInfMgr.Free;
  mbnConnMgr.Free;

  Readln;
end;

begin
  try
    Main;
  except
    on E: Exception do
      WriteLn(E.ClassName, ': ', E.Message);
  end;

end.
  Mit Zitat antworten Zitat
synAIRgy

Registriert seit: 27. Jan 2005
Ort: Nürnberg
4 Beiträge
 
Delphi 5 Enterprise
 
#2

AW: Windows MBN API für Delphi XE portieren

  Alt 13. Jul 2016, 16:35
Vielen Dank TiGü für die super Hilfe. Der entscheidende Hinweis war die "Supports" Funktion der SysUtils. Jetzt versteh ich wie ich die Datenstruktur mit dem Interface verbinde.

Ich habe Deine "Problemzeile" jetzt so gelöst, meine Gedankenschritte sind jeweils im Comment:

Code:
procedure Main;
var
  HR: HRESULT;
  mbnInfMgr: TMbnInterfaceManager;
  ConnectionEnum: IEnumConnectionPoints;
  infMgr: IMbnInterfaceManager;
  interfaces: PSafeArray;
  inf: IMbnInterface;
  MbnInterfaceManager: IMbnInterfaceManager;
  mbnConnMgr: TMbnConnectionManager;
  conMgr: IMbnConnectionManager;
  icpc: IConnectionPointContainer;
  icp: IConnectionPoint;
  connEvtsSink: IUnknown;
  cookie, requestID: UINT;
  conn: IMbnConnection;

  subscriberInfo: IMbnSubscriberInformation;

  //    einige dummy und Hilsvariablen
  x,i        : Integer;
  sabT       : TSafeArraybound;
  aPointer   : Pointer;
  iLow, iHigh : Integer;
  aSaElement : IMBNInterface;
  tstStr     : wideString;
  aSaElement : IMBNInterface;

begin
 mbnInfMgr := TMbnInterfaceManager.Create(nil);
  if Supports(mbnInfMgr.DefaultInterface, IMbnInterfaceManager, infMgr) then
  begin
    HR := infMgr.GetInterfaces(interfaces);
    if HR = S_OK then
    begin
       // Grenzen des TSafeArray mittels Hilfsvariable abfragen.
       sabt:=interfaces.rgsabound[0];
       writeln('No of Interface Elements/Bounds: '+intToStr(sabt.cElements)+'/'+intToStr(sabt.lLbound));
       SafeArrayLock(interfaces);
       try
            //  ich will dem IMBNInterface nur eines der im Interfacemanager gesammelten Interface zuweisen
            //  und zwar das erste
            x:=0;
            // das erste Interface holen und zwischenspeichern in aSaElement
            SafeArrayGetElement(interfaces,x,aSaElement);
            inf:=IMBNInterface(aSAElement); //... und zuweisen
            if inf.GetSubscriberInformation(subscriberInfo) = S_OK then begin;
               subscriberInfo.Get_SubscriberID(tstStr) ;
               writeln('Interface mounted. Subscriber: '+tstStr);
            end;
       finally
             SafeArrayUnlock(interfaces);
       end;

    end
    else
    begin
      RaiseLastOSError(HR);
    end;
  end;

  mbnConnMgr := TMbnConnectionManager.Create(nil);
  .........
......... der Rest ist wie gehabt
Funktioniert jetzt alles einwandfrei. Ich werde weitermachen und das ganze erweitern. Das MBN API eröffnet mächtige Möglichkeiten. Danke nochmals.
  Mit Zitat antworten Zitat
THY4243

Registriert seit: 15. Dez 2012
Ort: München - Untermenzing
45 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Windows MBN API für Delphi XE portieren

  Alt 27. Mär 2019, 22:34
Hallo zusammen,

das Thema MBNAPI nochmals aufgegriffen, denn auch Windows 10 unterstützt diese.

Die Events scheinen eine Herausforderung zu sein - zumindest drehe ich mich an der Stelle im Kreis. Aus den früheren Beiträgen die entscheidende Codestelle:
Code:
   mbnConnMgr := TMbnConnectionManager.Create(nil);

   icpc := mbnConnMgr.DefaultInterface;
   if Supports(icpc, IMbnConnectionManager, conMgr) then
   begin
     if icpc.FindConnectionPoint(IID_IMbnConnectionEvents, icp) = S_OK then
     begin
       connEvtsSink := TConnectionEventsSink.Create;
       icp.Advise(connEvtsSink, cookie);
     end;
   end;
Nach der Doku von Microsoft müsste das Event-Handle in "cookie" sein. Ziel wäre z.B. die Verwendung von "WaitForMultipleObjects" in Verbindung damit.
Die Realität scheint anders zu sein - schon im Hinblick auf die vorhandenen Funktionen "OnConnectComplete", "OnDisconnectComplete", ... .

Hat von Euch jemand einen Tipp, auch dahingehend, ob die Richtung stimmt?
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.075 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Windows MBN API für Delphi XE portieren

  Alt 1. Apr 2019, 10:17
Nein, "Cookie" ist nur eine Zahl/Hausnummer (Token), ggf. auch aufsteigend zählend (0, 1, 2...der Debugger weiß Rat), und ist kein Handle.
Der "Cookie" dient nur zur Identifizierung der Ereignissenke (event destination) beim "unadvisen" (abmelden).
Dies dient dazu, falls man mehrere IMbnConnectionEvents-Instanzen "advist"/ anmeldet.
Also das, was du wahrscheinlich in TConnectionEventsSink implementiert hast.

Die Verbindung mit klassischen Windows-Events (SetEvent, ResetEvent, WaitForMultipleObjects) musst du dann in den On...-Handlern selber herstellen, falls du das brauchst.
Vielleicht ist es auch gar nicht notwendig, für deinen Anwendungsfall, wenn die On...-Handler eh vom Betriebssystem getriggert werden.
  Mit Zitat antworten Zitat
THY4243

Registriert seit: 15. Dez 2012
Ort: München - Untermenzing
45 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Windows MBN API für Delphi XE portieren

  Alt 2. Apr 2019, 13:30
Hallo TiGü,

danke für Deine Einschätzung, auch was die Cookies betrifft.

Das Betriebssystem handelt die Events sicher selbst, nur die Konsolenanwendung bekommt sie nicht mit. Nach "// CONNECT HERE - AND WAIT FOR EVENTS" tritt keiner der " On...-Event " ein. Klar, ist auch nicht deklariert und stattdessen Sleep(..).

Die Versuche mit den On...-Handlern mag der Compiler, nur der Debugger "grüßt" noch. Mal sehen.
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.075 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Windows MBN API für Delphi XE portieren

  Alt 12. Apr 2019, 21:32
Hallo TiGü,

danke für Deine Einschätzung, auch was die Cookies betrifft.

Das Betriebssystem handelt die Events sicher selbst, nur die Konsolenanwendung bekommt sie nicht mit. Nach "// CONNECT HERE - AND WAIT FOR EVENTS" tritt keiner der " On...-Event " ein. Klar, ist auch nicht deklariert und stattdessen Sleep(..).

Die Versuche mit den On...-Handlern mag der Compiler, nur der Debugger "grüßt" noch. Mal sehen.
Ich bin sicher, man benötigt eine Windows message queue. Das gleiche Beispiel in eine VCL Form gegossen und es wird funktionieren.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:34 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz