Einzelnen Beitrag anzeigen

synAIRgy

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

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