Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Problem mit Funktion WNetAddConnection2 (https://www.delphipraxis.net/81700-problem-mit-funktion-wnetaddconnection2.html)

Mackhack 2. Dez 2006 04:08


Problem mit Funktion WNetAddConnection2
 
Hallo DPler,

ich habe folgenden Code:

Delphi-Quellcode:
function TfoMain.RegLoginAndConnectRegistry(lpMachineName: String; hKey: HKEY;
           var phkResult: HKEY; User, Password: String): LongInt;
var
  lpNetResource: TNetResource;
begin
  with lpNetResource do
  begin
    dwType := RESOURCETYPE_ANY;
    lpLocalName := nil;
    lpProvider := nil;
    lpRemoteName:= PChar(lpMachineName + '\IPC$');
  end;
  Result := WNetAddConnection2(lpNetResource, PChar(Password), PChar(User), 0);
  if ( Result = NO_ERROR ) then
  begin
    Result := RegConnectRegistry(PChar(lpMachineName), hKey, phkResult);
  end
  else
  begin
    ShowMessage(SysErrorMessage(GetLastError));
  end;
end;
Wenn ich ihn ausfuehre hat Result 67 und somit OK! Ich bekomme aber die ShowMessage angezeigt und sobald ich sie mit OK wegklicke bekomme ihc mein richtiges Ergebnis.

Weis jemand warum?

Meniskusschaden 2. Dez 2006 09:53

Re: Problem mit Funktion WNetAddConnection2
 
Ich bin der Meinung, daß WNetAddConnection2 0 für "OK" und 67 für "The network name cannot be found" zurück liefert.

ringli 2. Dez 2006 11:38

Re: Problem mit Funktion WNetAddConnection2
 
Funktioniert der Code denn mit einer administrativen Freigabe (z.B. C$)? Ich bin nämlich der Meinung das man sich auf die IPC$-Freigabe überhaupt nicht verbinden kann.

Mackhack 2. Dez 2006 19:56

Re: Problem mit Funktion WNetAddConnection2
 
Wie schon gesagt,

ich bekomme die ShowMessage, klicke sie weg und bin verbunden mit dem anderen PC!

DGL-luke 2. Dez 2006 20:45

Re: Problem mit Funktion WNetAddConnection2
 
stell mal die Optimierung aus ;-) die hat mir beim der WinAPI schon öfters Streiche gespielt....

EInfach {$O-} über die Funktion und {$O+} drunter.

Was steht denn in der MessageBox?

kannst es ja mal mit 0 probieren bzw. in die Messagebox zusätzlich den rückgabewert noch reintun.

Mackhack 2. Dez 2006 20:50

Re: Problem mit Funktion WNetAddConnection2
 
Hi Luke,

danke. Werd ich sofort probieren. Der Rueckgabewert ist 67 und als Fehler kommt dann ERROR_NO_NETWORK. Dann aber wie gesagt mit OK die ShowMessage weg und ich bin verbunden. Aber das kann ich ja so nicht wirklich lassen denn es ist ja dann nicht wirklich ein Error!

Christian Seehase 2. Dez 2006 23:53

Re: Problem mit Funktion WNetAddConnection2
 
Moin Mackhack,

ich hoffe doch mal, dass lpMachineName auch die führenden \\ beinhaltet.

Mackhack 2. Dez 2006 23:54

Re: Problem mit Funktion WNetAddConnection2
 
Inzwischen ja, seit ca. 1h!

Aber immer noch das gleiche Problem!

Mackhack 5. Dez 2006 15:12

Re: Problem mit Funktion WNetAddConnection2
 
Hi,

wie koennte ich denn pruefen ob RegConnectRegistry Nil ist? Denn laut MSDN wird die locale Registry ausgelesen/verbunden wenn es Nil ist. Da aber ja Result vom Typ LongInt ist weis ich nicht so recht wie machen. Mit Assigned(Result) will es nicht so wirklich!

Danke!

DGL-luke 5. Dez 2006 15:38

Re: Problem mit Funktion WNetAddConnection2
 
Öhm... entweder es ist ein Pointer (was ich mir nicht vorstellen kann; dann würde "null" im MSDN stehen) oder es ist ein Handle, in beiden Fällen kannst auf "=0" prüfen.

Mackhack 5. Dez 2006 15:56

Re: Problem mit Funktion WNetAddConnection2
 
Nil (Delphi) NULL(c++) laut MSDN

Christian Seehase 5. Dez 2006 17:35

Re: Problem mit Funktion WNetAddConnection2
 
Moin Mackhack,

vielleicht solltest Du Dir, beispielsweise, mal das PSDK bei MS runterladen, oder die MSDN-Library.
In der Dokumentation zu RegConnectRegistry steht dann auch, was als Rückgabewert möglich ist.

Nimm aber bloss nicht das SDK, das bei Delphi mitgeliefert wird, das ist nicht aktuell.
[EDIT]
Ich hab' jetzt mal in der D2006-Hilfe (SDK) nachgeschaut:
Es ist zwar vom Februar 2003, aber bezüglich RegConnectRegistry dürfte die Doku stimmen.
[/EDIT]

Mackhack 5. Dez 2006 18:13

Re: Problem mit Funktion WNetAddConnection2
 
Zitat:

Zitat von Christian Seehase
Moin Mackhack,

vielleicht solltest Du Dir, beispielsweise, mal das PSDK bei MS runterladen, oder die MSDN-Library.
In der Dokumentation zu RegConnectRegistry steht dann auch, was als Rückgabewert möglich ist.

Nimm aber bloss nicht das SDK, das bei Delphi mitgeliefert wird, das ist nicht aktuell.
[EDIT]
Ich hab' jetzt mal in der D2006-Hilfe (SDK) nachgeschaut:
Es ist zwar vom Februar 2003, aber bezüglich RegConnectRegistry dürfte die Doku stimmen.
[/EDIT]

Ich habe sowohl online als auch in der BDS2006 Hilfe nachgeschaut! Beidesmal kam raus dass wenn der \\Computername nil ist dass dann automatisch auf die lokale Registry zugegriffen wird! Daher fragte ich wie ich das auf Nil ueberpruefen kann wenn der Rueckgabewert doch ein LongInt ist in meiner Function!

Muetze1 5. Dez 2006 18:32

Re: Problem mit Funktion WNetAddConnection2
 
Nil ist als Ordinaltyp in Form eines Ganzzahltyps 0! Das wurde aber zuvor schon geschrieben...

Mackhack 5. Dez 2006 18:34

Re: Problem mit Funktion WNetAddConnection2
 
Hi Muetze1,

also Result einfach auf <> 0 pruefen fuer wenn es nil ist oder = 0 fuer nil *AufDerLeitungSteh*?

Sorry, ich frag nur nochmal zwecks Verstaendnis!

Muetze1 5. Dez 2006 18:38

Re: Problem mit Funktion WNetAddConnection2
 
Ich habe nur darauf hingewiesen, dass NIL = 0 wäre. Ob nun Gleichheit oder nicht hängt von der Doku ab. Wenn die MSDN nun als sagt, dass ein Parameter bei bestimmten Bedingungen Nil ist, dann würdest du ja theoretisch schrieben:
Delphi-Quellcode:
If var = Nil Then
- da dies nun nicht geht, nehmen wir den ersten Teil und ersetzen Nil mit dem oben angegebenen Ersatzwert:
Delphi-Quellcode:
If Var = 0 Then
.

Wenn die Variable ungleich Nil/NULL sein sollte laut Doku, dann sollte man das entsprechend anpassen...

Mackhack 5. Dez 2006 19:10

Re: Problem mit Funktion WNetAddConnection2
 
Danke!

Mackhack 7. Dez 2006 05:31

Re: Problem mit Funktion WNetAddConnection2
 
Hi,

ich habe nochmal ne Frage hier:

mit meiner jetzigen Funktion die soweit so aussieht

Delphi-Quellcode:
function TfoMain.RegLoginAndConnectRegistry(lpMachineName: String; hKey: HKEY;
           var phkResult: HKEY; User, Password: String): LongInt;
var
  lpNetResource: TNetResource;
begin
  with lpNetResource do
  begin
    dwType := RESOURCETYPE_ANY;
    lpLocalName := nil;
    lpProvider := nil;
    lpRemoteName := PChar(lpMachineName + '\IPC$');
  end;
  Result := WNetAddConnection2(lpNetResource, PChar(Password), PChar(User), 0);
  if ( Result = NO_ERROR ) then
  begin
    Result := RegConnectRegistry(PChar(lpMachineName), hKey, phkResult);
    if ( Result = 0 ) then
    begin
      ShowMessage('Error occurred: ' + SysErrorMessage(GetLastError) +
                   #10#13#10#13 + 'Error Code: 0x' + IntToHex(GetLastError, 8));
      Exit;
    end;
  end;
end;
bekomme ich bei (eigentlich) Erfolgreichem Login- und Verbindungsversuch die letzte ShowMessage um die Ohren gehauen mit dieser Meldung

[QUOTE
---------------------------
Keysearcher
---------------------------
Error occurred: Overlapped I/O operation is in progress


Error Code: 0x000003E5
---------------------------
OK
---------------------------
[/QUOTE]

und anschliessend kommt das richtige Ergebnis. Aufgerufen wird die Function so:

Delphi-Quellcode:
  if ( RegLoginAndConnectRegistry(foNetworkConnection.RemoteComputerName, Key, UsersKey, Username, Password) <> 0 ) then
Danke!

[edit=Christian Seehase]Doppelpost gelöscht. Mfg, Christian Seehase[/edit]

Christian Seehase 7. Dez 2006 14:35

Re: Problem mit Funktion WNetAddConnection2
 
Moin Mackhack,

Du hast doch die Doku zu RegConnectRegistry gelesen.
Bei erfolgreichem Aufruf gibt diese ERROR_SUCCESS zurück, warum fragst Du dort dann auf = 0 ab?
ERROR_SUCCESS hat den Wert 0.

Um einen Fehler zu ermitteln, müsstest Du also auf <> ERROR_SUCCESS bzw. <> 0 abfragen.

[EDIT]
Ausserdem ist Zeilenvorschub #13#10 und nicht #10#13 ;-)
[/EDIT]

Mackhack 7. Dez 2006 15:09

Re: Problem mit Funktion WNetAddConnection2
 
Hallo Christian,

ich dachte ich ueberpruefe (laut Muetze1) ob das Result Nil ist:

Zitat:

Parameters

lpMachineName
[in] The name of the remote computer. The string has the following form:

\\computername

The caller must have access to the remote computer or the function fails.

If this parameter is NULL, the local computer name is used.

DGL-luke 7. Dez 2006 15:36

Re: Problem mit Funktion WNetAddConnection2
 
Ähm... du übergibst da einen PChar. Wenn der nil ist (= leerstring) verbindest du dich mit dem lokalen pc. Oder steht da irgendwo was von return value?

Mackhack 7. Dez 2006 19:46

Re: Problem mit Funktion WNetAddConnection2
 
OK,

und wie koennte ich nun diese miesere beseitigen? Ich meine das mit dem wenn NULL!

Meniskusschaden 7. Dez 2006 20:21

Re: Problem mit Funktion WNetAddConnection2
 
Wenn ich den Beitrag von Christian richtig verstehe, meldet RegConnectRegistry Fehler mit Werten <> 0 und Du musst nur folgende Zeile ändern.
Delphi-Quellcode:
//  if ( Result = 0 ) then
    if ( Result <> 0 ) then
Du scheinst irgendwie den Computernamen und den Rückgabewert von RegConnectRegistry zu verwechseln.

marabu 7. Dez 2006 20:23

Re: Problem mit Funktion WNetAddConnection2
 
Hallo Tobias,

ich fürchte du bist auf der Jagd nach einem Phantom. Da ist kein Vergleich auf NULL nötig in deinem Code. Sowohl WNetAddConnection2() als auch RegConnectRegistry() liefern einen Fehlercode (DWORD oder LONG). Der einzige sonstige Ausgabeparameter ist das Key Handle bei RegConnectRegistry(), welches du später wieder mit RegCloseKey() freigeben sollst. Der Maschinenname kann als Leer-String angegeben werden - PChar() ist dann NIL. Das erfordert aber keine andere Vorgehensweise im inneren deiner Funktion.

Und wieder machst du eine Netzwerk-Funktion zu einer Methode deiner Form...

Gute Nacht

Mackhack 7. Dez 2006 21:02

Re: Problem mit Funktion WNetAddConnection2
 
Hi marabu,

ja ich weis. Werde das noch aendern. Gestern abend um 11 hatte ich keine Lust mehr das alles zu aendern. Werde mich aber heute damit noch beschaeftigen!

Christian Seehase 7. Dez 2006 23:17

Re: Problem mit Funktion WNetAddConnection2
 
Moin Meniskusschaden,

so hatte ich mir das gedacht, obwohl ich, aus Gründen der Lesbarkeit, statt der 0 lieber die Konstante ERROR_SUCCESS nehme.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:41 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