![]() |
Freigabe unter Windows erstellen
Hi,
ich habe den Thread weiter unten über das auflisten der Freigaben gelesen. War sehr aufschlußreich. Da ich in einem Programm eine Freigabe selbst machen will, habe ich mir die Jedi-Libary herunter geladen und mit mal dran gemacht. Ich komme damit aber nicht richtig klar. folgendes habe ich ausprobiert:
Delphi-Quellcode:
Die Funktion für das Auflisten (Button3Click) habe ich dem Thread entnommen. Das funktioniert auch.
unit Main;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls, ShellApi, LmShare, LmAccess; type TForm1 = class(TForm) Label1: TLabel; ProgressBar1: TProgressBar; Memo1: TMemo; Button1: TButton; Button2: TButton; procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; const NERR_Success = 0; MAX_PREFERRED_LENGTH = DWORD(-1); type NET_API_STATUS = type DWORD; PSHARE_INFO_0 = ^SHARE_INFO_0; SHARE_INFO_0 = packed record shi0_netname : PWChar; end; type PSHARE_INFO_2 =^SHARE_INFO_2; SHARE_INFO_2 = packed record shi2_netname : PWChar; shi2_type : Dword; shi2_remark : PWChar; shi_permissions : DWord; shi2_max_uses : DWord; shi2_current_uses : DWord; shi2_path : PWChar; shi2_passwd : PWChar; end; var reg: TRegistry; buffer1, buffer2, buffer3: array [1..32] of Char; i: Integer; ipaddress, subnetmask, DefaultGateway: string; Adapter, Adapter_Key: string; stringlist: TStrings; implementation uses ipadresse; {$R *.dfm} function NetApiBufferFree( const Buffer : Pointer ) : NET_API_STATUS; stdcall; external 'netapi32.dll'; function NetShareEnum( const servername : PWChar; const level : DWord; const bufptr : Pointer; const prefmaxlen : DWord; const entriesread : PDWord; const totalentries : PDWord; const resume_handle : PDWord ) : NET_API_STATUS; stdcall; external 'netapi32.dll'; procedure TForm1.Button3Click(Sender: TObject); var si2Work : PSHARE_INFO_2; si2Save : PSHARE_INFO_2; dwEntriesRead : DWORD; dwTotalEntries : DWORD; i : DWORD; begin if NetShareEnum(nil,2,@si2Work,MAX_PREFERRED_LENGTH,@dwEntriesRead,@dwTotalEntries,nil) <> Nerr_Success then exit; try si2Save := si2Work; for i := 1 to dwEntriesRead do begin if si2Save.shi2_type = STYPE_DISKTREE then memo1.lines.Add(si2Save.shi2_netname); inc(si2Save); end; finally NetApiBufferFree(si2Work); end; end; procedure TForm1.Button4Click(Sender: TObject); var share: PSHARE_INFO_2; err: DWord; begin Share.shi2_netname:='SBK'; share.shi2_type:=STYPE_DISKTREE; share.shi_permissions:=ACCESS_ALL; share.shi2_path:='c:\\mysql'; NetShareAdd('',2,@Share,@err); ShowMessage(Inttostr(err)); end; procedure TForm1.Button2Click(Sender: TObject); begin Application.Terminate; end; end. Aber bei der Funktion zum Freigeben (Button4Click) bekomme ich immer eine Zugriffsverletzung, und das schon beim ersten zugriff auf Share.shi2_netname. Kann mir einer von euch weiterhelfen? |
Re: Freigabe unter Windows erstellen
Ich vergaß zu erwähnen, das es sich hierbei um Windows XP handelt. Wobei ich allerdings später beide Lösungen (für Windows NT und Windows 9x) benötige.
Wobei ich aber hoffe, mir das entsprechende Äquivalent selbst ableiten zu können. |
Re: Freigabe unter Windows erstellen
Habs geschafft! :bouncing4: :bouncing4:
Folgende Änderung erbrachte eine erfolgreiche Freigabe:
Delphi-Quellcode:
Allerdings habe ich noch Probleme mit shi2_max_users. Laut MS wird mit -1 festgelegt, das es bei dieser Freigabe keine Beschränkungen gibt. Wenn ich -1 verwende meldet mir der Compiler, das ich die untere Grenze der Variable verletzte :(
procedure TForm1.Button4Click(Sender: TObject);
var share: TShareInfo2; err: DWord; begin Share.shi2_netname:='SBK'; share.shi2_type:=STYPE_DISKTREE; share.shi2_permissions:=ACCESS_ALL; Share.shi2_remark:='Testfreigabe'; share.shi2_max_uses:=4; share.shi2_current_uses:=0; share.shi2_passwd:=nil; share.shi2_path:='c:\mysql'; NetShareAdd('',2,@Share,@err); //ShowMessage(Inttostr(err)); SHChangeNotify(SHCNE_NETSHARE,SHCNF_PATH,PChar('c:\mysql'),nil); end; Weiß einer was hier rein muß? Wäre echt dankbar. |
Re: Freigabe unter Windows erstellen
:D
Auch das ist geschafft. ein $ffffffff erledigt das problemlos. Jetzt muß ich nur noch das ganze für 9x machen. Mal sehen ob ich das auch allein hinbekomme. :mrgreen: :mrgreen: Auch wenn ich mich jetzt hier nur mit mir selbst unterhalten habe, so hoffe ich doch, das es vielleicht anderen User hilft :mrgreen: :mrgreen: :mrgreen: |
Re: Freigabe unter Windows erstellen
Moin Captnemo,
da mir jetzt nicht ganz klar geworden ist, ob Dir klar ist, warum $FFFFFFFF funktioniert, und -1 nicht hier noch eine kleine Erklärung dazu: Der Typ der Variablen ist als DWORD angegeben, also 32-Bit ohne Vorzeichen (also 0 und positive Werte). Da -1 ja nun negativ ist, meckert der Compiler. $FFFFFFFF wird bei vorzeichenbehafteten 32 Bit Werten als -1 gewertet. Ersatzweise wäre auch DWORD(-1) gegangen. Was ich jetzt auch nicht verstehe: Zum einen hast Du die Jedi Libraries eingebunden, zum anderen hast Du die Deklarationen noch einmal direkt im Sourcecode. Warum das? Und denk dran: Wenn das Programm auch unter 9x/ME laufen soll, musst Du die Funktionen dynamisch importieren. |
Re: Freigabe unter Windows erstellen
Hi Christian,
das mit dem $FFFFFFFF = -1 ist mir klar geworden, als ich mich an meine Ausbildung erinnerte, da hab ich sowas mal gelernt. (Nur hab ich mich nicht gleich dran erinnert :oops: ). Allerdings den Befehl DWORD(-1) kannte ich noch nicht. Ist ne große Hilfe, auch für später, danke. Dir Declaration hab ich mittlerweile wieder enfernt. Ich hatte das erst ohne die Jedi-Libary versucht. Hab die erst später eingebunden, und die Declaration vergessen. Natürlich braucht man die nicht mehr, ist ja in der Jedi drin. Hab das ganze mittlerweile auch für 98 fertig, und funzt vorbildlich. Du schreibst Dynamisch ? Wie geht das ? Ich habe mir damit beholfen, das ich ein Prog für NT und ein Prog für 98 habe. Und eine Prog was die beiden abhängig von BS startet. Ist nur für eine Installationsroutine, und das auch OK so. Aber wie das dynamisch geht würde mich prizipiell schon interessieren (Für die Zukunft). Denn was mir am Programmieren (und grundsätzlich mit Delphi) so unheimlich reizt, ist das ich mit jedem Tag den damit verbringe, immer wieder was neues dazu lerne, oder zumindest, wie manche Dinge doch viel einfacher coden kann :D . Und das mach doch am meisten Spass. Gell. Ergo: Hut ab vor den Jedi's. (Und auch vor Dir, Christian) Ich würde das nicht hinbekommen. Hab leider in mancher Hinsicht noch zuviele Defizite, die ich leider auch nicht mehr aufholen werde. |
Re: Freigabe unter Windows erstellen
Moin Captnemo,
Zitat:
Das ist doch alles nur Übungssache. Was übrigens noch wichtig ist: Die Deklarationen der JEDIs und meine unterscheiden sich zum Teil. Bei den Funktionsdeklarationen der Jedis werden, wie bei Borland üblich, die Parameter in die die Funktion Werte reinschreibt meist als var deklariert, so dass man hier dann nicht die Adresse der Variablen übergeben muss, sondern "nur" den Variablennamen. Ich habe es mir hingegen angewöhnt die Parameter grundsätzlich C-typisch zu deklarieren. Der Grund dafür ist auch leicht zu erklären: Viele Beispiel Sourcen sind in C(++) geschrieben, so dass mir bei meiner Deklaration die Übersetzung nach Pascal leichter fällt. Ausserdem hat, für meinen Geschmack, die Verwendung von var Parametern auch einen grossen Nachteil: Wenn die Api-Funktion es zulässt, dass man einen Parameter nicht benutzt, und dies durch Übergabe von nil kenntlich macht, so kann man dies bei var Parametern nicht machen. Hier muss zwingend eine Variable übergeben werden. Ich finde das unübersichtlich, ausserdem muss ich dann, unnötiger Weise, Variablen deklarieren, die ich gar nicht brauche. Beispiele für den dynamischen Import von Funktionen wirst Du hier in grösserer Zahl finden können. ![]() ![]() [EDIT] Meiner Ansicht nach spricht nichts gegen zwei Programm Versionen für die unterschiedlichen Betriebssysteme [/EDIT] |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:42 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