Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Freigabe unter Windows erstellen (https://www.delphipraxis.net/8076-freigabe-unter-windows-erstellen.html)

Captnemo 28. Aug 2003 07:45


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:
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.
Die Funktion für das Auflisten (Button3Click) habe ich dem Thread entnommen. Das funktioniert auch.
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?

Captnemo 28. Aug 2003 07:51

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.

Captnemo 28. Aug 2003 08:19

Re: Freigabe unter Windows erstellen
 
Habs geschafft! :bouncing4: :bouncing4:

Folgende Änderung erbrachte eine erfolgreiche Freigabe:

Delphi-Quellcode:
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;
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 :(
Weiß einer was hier rein muß?

Wäre echt dankbar.

Captnemo 28. Aug 2003 08:51

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:

Christian Seehase 29. Aug 2003 21:23

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.

Captnemo 30. Aug 2003 08:46

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.

Christian Seehase 30. Aug 2003 13:31

Re: Freigabe unter Windows erstellen
 
Moin Captnemo,

Zitat:

Zitat von Captnemo
Hab leider in mancher Hinsicht noch zuviele Defizite, die ich leider auch nicht mehr aufholen werde.

Wie kommst Du denn da drauf?
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.

Hier im Forum suchenLOADLIBRARY, Hier im Forum suchenGetProcAddress

[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