![]() |
Internetverbindung freigeben
Hallo @all,
ich möchte gerne meine Internetverbindung (eigentlich die VPN-Verbindung) über das WLAN freigeben. Soweit geht das auch, nur jetzt soll es automatisiert werden (Cisco AnyConnect kann die Verbindung nicht aufbauen, wenn die Freigabe aktiv ist). Das Provisoroium in VB funktioniert auch soweit, nur jetzt solls halt bitte in Delphi (und kompiliert) sein. Leider ist es nicht ganz so einfach, wie gedacht (irgendwas macht VB da anders). Die Netzwerkkarten gibt es als Collection-Interface. Der ActiveX-Importer meinte (gleichlautend mit MSDN), das Interface sieht aus wie folgt:
Delphi-Quellcode:
Dem schnellen Auge sollte auffallen, dass man irgendwie nicht an die einzelnen Elemente kommt (da es mit VB und JScript (nicht getestet, aber MSDN hat ein Beispiel) geht, muss es gehen!).
// *********************************************************************//
// Interface: INetSharingEveryConnectionCollection // Flags: (4416) Dual OleAutomation Dispatchable // GUID: {33C4643C-7811-46FA-A89A-768597BD7223} // *********************************************************************// INetSharingEveryConnectionCollection = interface(IDispatch) ['{33C4643C-7811-46FA-A89A-768597BD7223}'] function Get__NewEnum: IUnknown; safecall; function Get_Count: Integer; safecall; property _NewEnum: IUnknown read Get__NewEnum; property Count: Integer read Get_Count; end; // *********************************************************************// // DispIntf: INetSharingEveryConnectionCollectionDisp // Flags: (4416) Dual OleAutomation Dispatchable // GUID: {33C4643C-7811-46FA-A89A-768597BD7223} // *********************************************************************// INetSharingEveryConnectionCollectionDisp = dispinterface ['{33C4643C-7811-46FA-A89A-768597BD7223}'] property _NewEnum: IUnknown readonly dispid -4; property Count: Integer readonly dispid 1; end; Delphi meinte zu meiner for-in-Schleife nur:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var NetSharingManager: INetSharingManager; AllConnections: INetSharingEveryConnectionCollection; Item: INetConnection; props: INetConnectionProps; begin NetSharingManager := CoNetSharingManager.Create; ShowMessage(BoolToStr(NetSharingManager.SharingInstalled, true)); // True, wenn Admin-Rechte und alles OK, sonst False AllConnections := NetSharingManager.EnumEveryConnection; for Item in AllConnections do // Das hier ist Zeile 38 begin props := NetSharingManager.NetConnectionProps[Item]; ListBox1.Items.Add('Name: ' + props.Name); ListBox1.Items.Add('Guid: ' + props.Guid); ListBox1.Items.Add('DeviceName: ' + props.DeviceName); ListBox1.Items.Add('Status: ' + props.Status); ListBox1.Items.Add('MediaType: ' + props.MediaType); ListBox1.Items.Add(''); ListBox1.Items.Add(''); end; end; Zitat:
![]() ![]() Grüße rollstuhlfahrer PS: ![]() ![]() |
AW: Internetverbindung freigeben
Probier mal folgendes, vielleicht kann der compiler das InterfaceElement Item nicht auflösen:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var NetSharingManager: INetSharingManager; AllConnections: INetSharingEveryConnectionCollection; Item: INetConnection; props: INetConnectionProps; idx: integer; begin NetSharingManager := CoNetSharingManager.Create; ShowMessage(BoolToStr(NetSharingManager.SharingInstalled, true)); // True, wenn Admin-Rechte und alles OK, sonst False AllConnections := NetSharingManager.EnumEveryConnection; //for Item in AllConnections do // Das hier ist Zeile 38 for idx :=0 to AllConnections.Count -1 do // Das hier ist Zeile 38 begin item:=AllConnection[idx]; //wenn das nicht geht dann vielleicht gibt es in AllConnections.Items oder sowas um das Item element auf Grund eines Index zu bekommen props := NetSharingManager.NetConnectionProps[Item]; ListBox1.Items.Add('Name: ' + props.Name); ListBox1.Items.Add('Guid: ' + props.Guid); ListBox1.Items.Add('DeviceName: ' + props.DeviceName); ListBox1.Items.Add('Status: ' + props.Status); ListBox1.Items.Add('MediaType: ' + props.MediaType); ListBox1.Items.Add(''); ListBox1.Items.Add(''); end; end; |
AW: Internetverbindung freigeben
Deine Schnittstelle sieht ja so aus
Delphi-Quellcode:
während im Delphi Enumeratoren für die FOR-IN-Schleife so aussehen müssen
property _NewEnum: {type} read ...;
property Count: Integer read ...;
Delphi-Quellcode:
_NewEnum könnte man zwar noch in Current umbenennen, aber dei Count hört es dann auf.
property Current: {Type} read ...;
function MoveNext: Boolean; Du kannst mit deinem "Enumerator"-Interface praktisch nur die Anzahl (Count) abfragen und dann entsprechend oft nacheinander via _NewEnum die Interfaces auslesen. |
AW: Internetverbindung freigeben
@danielmagin: Wenns so einfach wäre :(. Das was ich an Code gepostet habe, ist alles, was ich zu dem Collection-Interface habe.
@himi: Danke für den Tipp. Aber: Entweder mache ich was falsch, oder es ist noch nicht die echte Lösung. Das _NewEnum liefert was zurück, aber bei jedem Aufruf das gleiche (Adresse ändert sich nicht). Wenn ich jetzt die Netzwerk-Interface Eigenschaften haben will (NetSharingManager.NetConnectionProps[Item], Code: siehe Link in #1) beschwert sich Windows: EOleException: 'Schnittstelle nicht unterstützt'. Versuche ich es nur mit einer Methode des zurückgegebenen Interfaces gann gibts über GetLastError() diese mehr oder weniger kryptische Meldung: 'Der angeforderte Nachschlageschlüssel konnte in keinem aktiven Aktivierungskontext gefunden werden'. Ich hoffe, das war aussagekräftiger als ein "geht nicht". rollstuhlfahrer |
AW: Internetverbindung freigeben
Keine Ahnung ob das hilft:
Delphi-Quellcode:
var
vEnum: IEnumVariant; vNetCon: OleVARIANT; dwRetrieved: Cardinal; begin {...} vEnum := NetSharingManager.EnumEveryConnection._NewEnum as IEnumVariant; while (vEnum.Next(1, vNetCon, dwRetrieved) = S_OK) do begin Item := (IUnknown(vNetCon) as INetConnection); {...} |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:40 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