![]() |
Probleme mit NetShareEnum
Hi,
ich versuche gerade irgendwie alle Freigaben aufzulisten, aber trotzdem macht mir die WinAPI da einen Strich durch die Rechnung. Mit Hilfe der JEDI-Überestzung der lm.h rufe ich su NetShareEnum auf:
Delphi-Quellcode:
Dazu folgenden Variablen:
NetShareEnum(@sServer[1], 502, @aShareBuffer, MAX_PREFERRED_LENGTH,
dwEntriesRead, dwEntriesRead, nil);
Delphi-Quellcode:
Der Delphi-Compiler wirft mir aber hinter
type
PSHARE_INFO_502 = ^_SHARE_INFO_502; var aShareBuffer, aWorkBuffer: PSHARE_INFO_502; dwEntriesRead: Cardinal;
Delphi-Quellcode:
folgenden Fehler in's Gesicht:
@aShareBuffer,
Ausgabe des Compilers [Fehler] MainUnit.pas(42): Die Typen der tatsächlichen und formalen Var-Parameter müssen übereinstimmen Mir ist klar, was mir Delphi damit sagen will, aber in meinen Augen ist das alles richtig. Die Definition der Funktion in den Jedi-Übersetzungen lautet so:
Delphi-Quellcode:
Wo ist da der Hund begraben? :gruebel:
function NetShareEnum(servername: LPTSTR; level: DWORD; var butptr: Pointer;
prefmaxlen: DWORD; var entriesread: DWORD; var totalentries: DWORD; resume_handle: PDWORD): NET_API_STATUS; stdcall; Chris |
Re: Probleme mit NetShareEnum
Moin.
Also, wenn ich das richtig sehe, ist aShareBuffer ja ein Zeiger, nicht wahr? Und ein var-Parameter vom Typ Pointer ist dann doch schon von sich aus ein Zeiger auf den Zeiger, oder? Und folglich übergibst du mit @aShareBuffer einen Zeiger auf einen Zeiger, der aber durch das var nochmal referenziert wird, stimmt's? Und wenn ich das tatsächlich richtig sehe, musst du einfach mal das @ vor aShareBuffer wegnehmen... |
Re: Probleme mit NetShareEnum
Hi,
leider der exakt identische Fehler. :? Chris |
Re: Probleme mit NetShareEnum
Komisch, bei mir kompiliert das ohne das @...
|
Re: Probleme mit NetShareEnum
Hi,
dann stelle ich jetzt einfach mal die Behauptung auf, dass das daran liegt, dass du D3 hast und ich D7... :gruebel: Das wäre die einfachste Erklärung. Aber irgendwie muss das doch gehen. Schließlich ist NetUserEnum (zum auflisten von Benutzern auf einem Rechner) nahezu identisch aufgebaut und dort hat es funktioniert. Als letzte Erklärung bliebe mir nur noch, dass es ein kleiner Fehler in der Headerübersetzung ist. Oder hat jemand eine andere Idee oder gar eine Lösung? Chris |
Re: Probleme mit NetShareEnum
Ich hab's in D4 probiert ;c)
Und extra für dich hab' ich's jetzt auch nochmal in D7Personal probiert und es funktioniert auch. Ich muss dazu sagen, dass ich nicht die Jedi-Header habe, sondern lediglich deine Deklaration inkludiert und wie folgt abgeändert habe:
Delphi-Quellcode:
Ich habe also den Rückgabewert (der ja egal ist) geändert, weil der andere Typ nicht bekannt ist, und die external-Deklaration hinzugefügt. An der Parametern habe ich nichts gedreht. Und dann habe ich einfach einen untypisierten Pointer übergeben.
function NetShareEnum(servername: LPTSTR; level: DWORD; var butptr: Pointer;
prefmaxlen: DWORD; var entriesread: DWORD; var totalentries: DWORD; resume_handle: PDWORD): Integer; stdcall; external 'netapi32.dll'; So, und jetzt habe ich mal probiert, einen Zeiger auf was anderes zu übergeben, und da bekomme ich denselben Fehler wie du. Also caste ich den Zeiger in einen Pointer, und siehe da, es funktioniert ;c) Probier' also mal
Code:
zu übergeben.
Pointer(aShareBuffer)
|
Re: Probleme mit NetShareEnum
Hi,
super! Das funktioniert. Hätte man ja fast drauf kommen müssen. *g* Allerdings werden mir jetzt immer nur die ersten Buchstaben der Ergebnisse angezeigt. Aber allen Anschein nach sind es wirklich die richtigen Freigaben, nur halt nur der 1. Buchstabe. :? Woran kann das jetzt wieder liegen? :wall: Entweder bin ich heute nicht ganz fit oder ich bin - mal wieder - mit meinem WinAPI-Latein am Ende. :| Chris |
Re: Probleme mit NetShareEnum
Benutzt du 9x oder NT?
[Edit]Schon gut, hat sich erledigt, 502 wird von 9x ja gar nicht unterstützt ;c)[/edit] Aber ich nehme an, du hast drauf geachtet, dass es sich um einen Unicode-String (d.h. WideChar) handelt? |
Re: Probleme mit NetShareEnum
Hi,
nicht das ich wüsste. :oops: Was muss ich denn da spezielles beachten? Chris |
Re: Probleme mit NetShareEnum
Ich arbeite zu wenig mit Delphi (und mit Unicode (c; ), als dass ich wüsste, wie es Unicode handhabt. Aber WideChars bestehen im allgemeinen aus zwei Byte. Es ist also möglich, dass das jeweils erste Zeichen einen Code hat, der im ersten Byte dem Ascii-Code entspricht, im zweiten jedoch 0 ist. Und 0 ist bei AnsiStrings im allgemeinen das String-Ende-Zeichen. Du kannst mal ausprobieren, den Namen des Shares mit WideCharToString in einen normalen String umzuwandeln und dann schau mal, ob der dann richtig ist.
|
Re: Probleme mit NetShareEnum
Hi,
wenn ich das so mache, wie du das vorschlägst, also ungefähr so
Delphi-Quellcode:
funktioniert das auch nicht. Dann habe ich da nur noch ein paar Fragezeichen und ein paar Blöcke... ;)
lviNewItem.Caption := WideCharToString(@aWorkBuffer.shi502_netname);
Chris |
Re: Probleme mit NetShareEnum
Ich wage jetzt einmal zu behaupten, dass das @ nicht sein muss, weil ein LMSTR (was der offensichtliche Typ des Strings ist) ein LPWSTR ist, was einem PWideChar entspricht, und somit schon ein Zeiger ist. Probier' das auch nochmal, wenn das nicht funktioniert, weiß ich's auch nicht ;c)
|
Re: Probleme mit NetShareEnum
Hi,
Delphi-Compiler [Fehler] MainUnit.pas(50): Inkompatible Typen: 'Char' und 'WideChar' Ohne Worte. ;) Chris |
Re: Probleme mit NetShareEnum
Bei mir ist LMSTR ein PWideChar :shock:
Daher macht "Inkompatible Typen: 'Char' und 'WideChar'" doch überhaupt keinen Sinn... Übrigens:
Delphi-Quellcode:
liest alles perfekt aus...
TShareInfo502Array = Array of SHARE_INFO_502;
[...] procedure TForm1.FormCreate(Sender: TObject); var shareBuffer: TShareInfo502Array; dwRead, dwEntries: Cardinal; i: Integer; begin NetShareEnum(nil, 502, PByte(shareBuffer), MAX_PREFERRED_LENGTH, @dwRead, @dwEntries, nil); for i := 0 to dwRead - 1 do begin ShowMessage(WideCharToString(shareBuffer[i].shi502_netname)); end; end; Du hast scheinbar eine ältere Version der Header, denn in meiner (die ich eben gerade heruntergeladen habe) sind die beiden DWORDS-Parameter nicht mehr var, sondern PDWORD... Es funktioniert auch, wenn ich die Namen so ausgebe:
Delphi-Quellcode:
ShowMessage(WideCharToString(shareBuffer[i].shi502_netname));
|
Re: Probleme mit NetShareEnum
Hi,
wenn ich den Code von dir 1-zu-1 übernehme bekomme ich immer noch den Fehler mit den formalen Parametern und soweiter. Allerdings dreimal: zwei Mal zusätzlich bei @dwRead bzw. @dwEntries. Wenn ich den so anpasse, dass er diese Fehler nicht mehr angibt sieht das ganze so aus:
Delphi-Quellcode:
Und es werden wieder nur der erste Buchstabe angezeigt.
procedure TfrmMain.FormCreate(Sender: TObject);
var shareBuffer: PSHARE_INFO_502; s2: TShareInfo502Array; dwRead, dwEntries: Cardinal; i: Integer; begin NetShareEnum(nil, 502, Pointer(shareBuffer), DWORD(-1), dwRead, dwEntries, nil); s2 := TShareInfo502Array(shareBuffer); for i := 0 to dwRead - 1 do begin ShowMessage(s2[i].shi502_netname); end; end; Chris PS: Nur um Missverständnisse vorzubeugen: ich habe die JwaLM auskommentiert und dafür deine Deklaration genommen. ;) |
Re: Probleme mit NetShareEnum
Wie ich schon sagte, ich habe mir die aktuellen Jedi-Header geladen und die fordern ein @dwRead etc. Du solltest vielleicht auch mal die neue Version runterladen!?
Dort funktioniert auch nicht mehr die Konvertierung nach Pointer, es muss nach PByte konvertiert werden. |
Re: Probleme mit NetShareEnum
Hi,
ich kapiere langsam gar nichts mehr. Also: ich habe mir gerade von der Website des Autors ( ![]() Alle alten Dateien gelöscht, überall nach Überresten gesucht und dann die Dateien in das Verzeichnis entpackt und dann versucht das ganze zu kompilieren. Es geht immer noch nicht. Bei deinem Code kommen die Fehler, wie bisher und bei dem veränderten wieder nur die ersten Buchstaben. Es bleibt also bei folgendem Source, der nicht richtig funktioniert:
Delphi-Quellcode:
Chris
type
PSHARE_INFO_502 = ^_SHARE_INFO_502; TShareInfo502Array = Array of _SHARE_INFO_502; procedure ListNetShares(const sServer: PAnsiChar); var aShareBuffer: PSHARE_INFO_502; aWorkBuffer: TShareInfo502Array; dwEntriesRead: Cardinal; i: integer; lviNewItem: TListItem; begin NetShareEnum(sServer, 502, PByte(aShareBuffer), MAX_PREFERRED_LENGTH, dwEntriesRead, dwEntriesRead, nil); aWorkBuffer := TShareInfo502Array(aShareBuffer); for i:=0 to dwEntriesRead - 1 do begin lviNewItem := frmMain.lvShares.Items.Add; lviNewItem.Caption := aWorkBuffer[i].shi502_netname; end; end; |
Re: Probleme mit NetShareEnum
Hmm... das ist lustig, ich habe natürlich nicht bei dem Autor geguckt, weil ich davon ausging, dass die Datei bei den Jedi die neueste ist. Wie du korrekt bemerkst, ist sie das nicht, denn sie ist vom 25. November 2002.
Aber mit der alten Version funktioniert das ganze 1a. Vielleicht ist da was verschlimmbessert worden? Ne, ich hab' mir die von dir genannte Version gezogen und die Deklaration von NetShareEnum ist auf den ersten Blick identisch mit der in meiner alten Version, also anders als die, die du am Thread-Anfang genannt hast. Ich habe also die neue Version in mein Lib-Verzeichnis extrahiert und - ÜBERRASCHUNG - es funktioniert immer noch. Unter Delphi 7 Personal. Folgender Code funktioniert mit der von dir genannten Version der Header unter Delphi 7 Personal:
Delphi-Quellcode:
Mir ist dabei noch eine Kleinigkeit aufgefallen, die dich eventuell verwirrt: Bei den Freigaben sind auch immer alle Laufwerke mit einem Dollarzeichen dabei (also C$, D$, E$ usw.), zusätzlich zu den normalen Freigabe-Ordnern. Andererseits hast du nicht von einem Buchstaben plus Dollarzeichen geschrieben...
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, JwaLM, JwaLmShare; type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; TShareInfo502Array = Array of SHARE_INFO_502; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); var shareBuffer: TShareInfo502Array; dwRead, dwEntries: Cardinal; i: Integer; begin NetShareEnum(nil, 502, PByte(shareBuffer), MAX_PREFERRED_LENGTH, @dwRead, @dwEntries, nil); for i := 0 to dwRead - 1 do begin ShowMessage(WideCharToString(shareBuffer[i].shi502_netname)); end; end; end. Fakt ist jedenfalls, der von mir gepostete Code funktioniert, und wenn er bei dir nicht funktioniert, dann muss wohl irgendwas an deinem Delphi korrupt sein... |
Re: Probleme mit NetShareEnum
Hi,
es war noch viel einfacher, als ich dachte. Als ich gerade deinen Source 1-zu-1 kopieren wollte, um ihn zu testen ist mir aufgefallen, dass du die JwaLMShare verwendest. Ich habe sie einfach mal eingebunden und seit dem funktioniert. Das komische ist, dass die Deklaration in der JwaLM eine etwas andere ist, als in der JwaLMShare zumindest macht diese Unit den Unterschied aus. Ist mir zwar ein kleines Rätsel, aber unser Dialog ist ja zu einem glücklichen Ende gekommen. :mrgreen: Vielen Dank, Chris |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:06 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