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