AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Freigabe unter Windows erstellen
Thema durchsuchen
Ansicht
Themen-Optionen

Freigabe unter Windows erstellen

Ein Thema von Captnemo · begonnen am 28. Aug 2003 · letzter Beitrag vom 30. Aug 2003
Antwort Antwort
Benutzerbild von Captnemo
Captnemo

Registriert seit: 27. Jan 2003
Ort: Bodenwerder
1.126 Beiträge
 
Delphi XE4 Architect
 
#1

Freigabe unter Windows erstellen

  Alt 28. Aug 2003, 07:45
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?
Dieter
9 von 10 Stimmen in meinem Kopf sagen ich bin nicht verrückt. Die 10. summt dazu die Melodie von Supermario Bros.
MfG Captnemo
  Mit Zitat antworten Zitat
Benutzerbild von Captnemo
Captnemo

Registriert seit: 27. Jan 2003
Ort: Bodenwerder
1.126 Beiträge
 
Delphi XE4 Architect
 
#2

Re: Freigabe unter Windows erstellen

  Alt 28. Aug 2003, 07:51
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.
Dieter
9 von 10 Stimmen in meinem Kopf sagen ich bin nicht verrückt. Die 10. summt dazu die Melodie von Supermario Bros.
MfG Captnemo
  Mit Zitat antworten Zitat
Benutzerbild von Captnemo
Captnemo

Registriert seit: 27. Jan 2003
Ort: Bodenwerder
1.126 Beiträge
 
Delphi XE4 Architect
 
#3

Re: Freigabe unter Windows erstellen

  Alt 28. Aug 2003, 08:19
Habs geschafft!

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.
Dieter
9 von 10 Stimmen in meinem Kopf sagen ich bin nicht verrückt. Die 10. summt dazu die Melodie von Supermario Bros.
MfG Captnemo
  Mit Zitat antworten Zitat
Benutzerbild von Captnemo
Captnemo

Registriert seit: 27. Jan 2003
Ort: Bodenwerder
1.126 Beiträge
 
Delphi XE4 Architect
 
#4

Re: Freigabe unter Windows erstellen

  Alt 28. Aug 2003, 08:51

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.

Auch wenn ich mich jetzt hier nur mit mir selbst unterhalten habe, so hoffe ich doch, das es vielleicht anderen User hilft
Dieter
9 von 10 Stimmen in meinem Kopf sagen ich bin nicht verrückt. Die 10. summt dazu die Melodie von Supermario Bros.
MfG Captnemo
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: Freigabe unter Windows erstellen

  Alt 29. Aug 2003, 21:23
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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von Captnemo
Captnemo

Registriert seit: 27. Jan 2003
Ort: Bodenwerder
1.126 Beiträge
 
Delphi XE4 Architect
 
#6

Re: Freigabe unter Windows erstellen

  Alt 30. Aug 2003, 08:46
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 ).

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 . 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.
Dieter
9 von 10 Stimmen in meinem Kopf sagen ich bin nicht verrückt. Die 10. summt dazu die Melodie von Supermario Bros.
MfG Captnemo
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: Freigabe unter Windows erstellen

  Alt 30. Aug 2003, 13:31
Moin Captnemo,

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]
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:58 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz