AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Internetverbindung freigeben

Ein Thema von rollstuhlfahrer · begonnen am 4. Okt 2013 · letzter Beitrag vom 7. Okt 2013
Antwort Antwort
Benutzerbild von rollstuhlfahrer
rollstuhlfahrer

Registriert seit: 1. Aug 2007
Ort: Ludwigshafen am Rhein
1.529 Beiträge
 
Delphi 7 Professional
 
#1

Internetverbindung freigeben

  Alt 4. Okt 2013, 21:13
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:
// *********************************************************************//
// 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;
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!).

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 von Delphi XE2:
[DCC Fehler] Unit1.pas(38): E2431 for-in-Anweisung arbeitet nicht mit Kollektionstyp 'INetSharingEveryConnectionCollection', weil 'INetSharingEveryConnectionCollection' kein Element für 'GetEnumerator' enthält oder darauf nicht zugegriffen werden kann
Dabei bin ich auch nicht der erste, der daran gescheitert ist (siehe 1 und 2). Wie kommt man denn jetzt an die einzelnen Elemente ran? Ich würde mich aber über jeden Tipp freuen!

Grüße
rollstuhlfahrer

PS: Code in JScript, Code in VB
Bernhard
Iliacos intra muros peccatur et extra!
  Mit Zitat antworten Zitat
Benutzerbild von danielmagin
danielmagin

Registriert seit: 6. Dez 2003
Ort: Frankfut am Main
54 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#2

AW: Internetverbindung freigeben

  Alt 5. Okt 2013, 17:50
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;
Daniel Magin
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.929 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Internetverbindung freigeben

  Alt 5. Okt 2013, 18:33
Deine Schnittstelle sieht ja so aus
Delphi-Quellcode:
property _NewEnum: {type} read ...;
property Count: Integer read ...;
während im Delphi Enumeratoren für die FOR-IN-Schleife so aussehen müssen
Delphi-Quellcode:
property Current: {Type} read ...;
function MoveNext: Boolean;
_NewEnum könnte man zwar noch in Current umbenennen, aber dei Count hört es dann auf.


Du kannst mit deinem "Enumerator"-Interface praktisch nur die Anzahl (Count) abfragen und dann entsprechend oft nacheinander via _NewEnum die Interfaces auslesen.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
Benutzerbild von rollstuhlfahrer
rollstuhlfahrer

Registriert seit: 1. Aug 2007
Ort: Ludwigshafen am Rhein
1.529 Beiträge
 
Delphi 7 Professional
 
#4

AW: Internetverbindung freigeben

  Alt 7. Okt 2013, 00:14
@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
Bernhard
Iliacos intra muros peccatur et extra!
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.348 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Internetverbindung freigeben

  Alt 7. Okt 2013, 10:44
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);
  {...}
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 03:24 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf