Avatar billede logix Nybegynder
19. februar 2002 - 12:36 Der er 8 kommentarer og
2 løsninger

Virtuelt drev eller drev mapping..

Er der nogen der kender til et api kald el.lign til at lave et virtuelt drev eks. et X: drev som peger på enten en tilfældig mappe (c:\test\myxdrive\), eller hvor indholdet kan bestemmes fra ens program? Har søgt og søgt.. Det skal kunne virke på en 2000, så subst er ikke en løsning..

- Logix
Avatar billede martinlind Nybegynder
19. februar 2002 - 12:47 #1
Subst viker fint på W2K, bruger det selv

Så du kan lave en ShellExecute();
Avatar billede stoney Nybegynder
19. februar 2002 - 12:49 #2
function ConnectDrive(_drvLetter: string; _netPath: string; _showError: Boolean;
  _reconnect: Boolean): DWORD;
var
  nRes: TNetResource;
  errCode: DWORD;
  dwFlags: DWORD;
begin
  { Fill NetRessource with #0 to provide uninitialized values }

  FillChar(NRes, SizeOf(NRes), #0);
  nRes.dwType := RESOURCETYPE_DISK;
  { Set Driveletter and Networkpath }

  nRes.lpLocalName  := PChar(_drvLetter);
  nRes.lpRemoteName := PChar(_netPath); { Example: \\Test\C }
  { Check if it should be saved for use after restart and set flags }

  if _reconnect then
    dwFlags := CONNECT_UPDATE_PROFILE and CONNECT_INTERACTIVE
  else
    dwFlags := CONNECT_INTERACTIVE;

  errCode := WNetAddConnection3(Form1.Handle, nRes, nil, nil, dwFlags);
  { Show Errormessage, if flag is set }

  if (errCode <> NO_ERROR) and (_showError) then
  begin
    Application.MessageBox(PChar('An error occured while connecting:' + #13#10 +
      SysErrorMessage(GetLastError)),
      'Error while connecting!',
      MB_OK);
  end;
  Result := errCode; { NO_ERROR }
end;

function ConnectPrinterDevice(_lptPort: string; _netPath: string; _showError: Boolean;
  _reconnect: Boolean): DWORD;
var
  nRes: TNetResource;
  errCode: DWORD;
  dwFlags: DWORD;
begin
  { Fill NetRessource with #0 to provide uninitialized values }

  FillChar(NRes, SizeOf(NRes), #0);
  nRes.dwType := RESOURCETYPE_PRINT;
  { Set Printername and Networkpath }

  nRes.lpLocalName  := PChar(_lptPort);
  nRes.lpRemoteName := PChar(_netPath); { Example: \\Test\Printer1 }

  if _reconnect then
    dwFlags := CONNECT_UPDATE_PROFILE and CONNECT_INTERACTIVE
  else
    dwFlags := CONNECT_INTERACTIVE;

  errCode := WNetAddConnection3(Form1.Handle, nRes, nil, nil, dwFlags);

  if (errCode <> NO_ERROR) and (_showError) then
  begin
    Application.MessageBox(PChar('An error occured while connecting:' + #13#10 +
      SysErrorMessage(GetLastError)),
      'Error while connecting!',
      MB_OK);
  end;
  Result := errCode; { NO_ERROR }
end;

function DisconnectNetDrive(_locDrive: string; _showError: Boolean; _force: Boolean;
  _save: Boolean): DWORD;
var
  dwFlags: DWORD;
  errCode: DWORD;
begin

  if _save then
    dwFlags := CONNECT_UPDATE_PROFILE
  else
    dwFlags := 0;

  errCode := WNetCancelConnection2(PChar(_locDrive), dwFlags, _force);

  if (errCode <> NO_ERROR) and (_showError) then 
  begin
    Application.MessageBox(PChar('An error occured while disconnecting:' + #13#10 +
      SysErrorMessage(GetLastError)),
      'Error while disconnecting',
      MB_OK);
  end;
  Result := errCode; { NO_ERROR }
end;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);

begin
ConnectDrive('h:', '\\servernavn\sharenavn', True, True);

end;

procedure TForm1.Button2Click(Sender: TObject);
begin
DisconnectNetDrive('h:', True, True, True);
end;

Stoney
Avatar billede dkn Nybegynder
19. februar 2002 - 13:02 #3
hmm jeg kan ikke lige få subst til at virke på xp...

ellers skulle det virke sådan her mener jeg:

uses shellapi;

procedure TForm1.Button1Click(Sender: TObject);
Const
Drevnavn = 'T';
begin
ShellExecute(Handle,'open', pchar('cmd Subst '+Drevnavn), nil, nil, SW_SHOWNORMAL);
end;
Avatar billede logix Nybegynder
19. februar 2002 - 13:11 #4
Det er mig ret væsentligt at der er tale om et kald der kan interceptes.. Det sidste burde jeg nu nok selv kunne finde ud af, men selve kaldet der definerer et nyt drev? Jeg har set masser af programmer som kan gøre det, men jeg kan sq ikke lure hvordan..
Om jeg er nødt til at finde ud af hvordan jeg laver en vxd driver for at gøre det eller hvordan..
Det jeg egenltig er ude efter er at jeg vil prøve at lege med dynamisk at genere indholdet på dette drev, runtime.. Således at man fra sin kode definerer indholdet af drevet..
Avatar billede logix Nybegynder
19. februar 2002 - 13:14 #5
subst må jo også bruge det kald.
Avatar billede logix Nybegynder
19. februar 2002 - 13:38 #6
Kikkede lige i subst.exe.. Den benytter api kaldet "DefineDosDevice".

BOOL DefineDosDevice(
  DWORD dwFlags,        // controllable aspect flag
  LPCTSTR lpDeviceName, // pointer to an MS-DOS device name string
  LPCTSTR lpTargetPath  // pointer to an MS-DOS or Windows NT path string
);


Det ser ud til at det er det der bruges normalt.. Lidt trist, da jeg så nok er nød til at lære at skrive en driver ;)...
Tak anyways..
Avatar billede martinlind Nybegynder
19. februar 2002 - 13:44 #7
Hvorfor vil du skrive en driver, du kan da bare bruge det API kald
Avatar billede logix Nybegynder
19. februar 2002 - 14:03 #8
Ja.. Men ikke til at definere indholdet.. Hvis nu du dobbeltklikker på en eks en tekstfil, så er planen at delphi programmet skal outputte indholdet af denne tekst fil.. Altså at den ikke ekstirer, men genereres "on demand".. Eller hvis du har en kæmpe zip fil,hvor du vil ha zipfilen "mountet" som et drev, så når du browser drevet, browser du i virkeligheden indholdet af zipfilen som IKKE er blevet midlertidigt pakket ud først til en eller anden sti... Catch my drift? :).. Det er kun et lege-projekt for at se hvordan man gør..
Avatar billede logix Nybegynder
19. februar 2002 - 14:05 #9
Hvis nogen har interesse i det så er her et lille eksempel på brugen af api kaldet jeg fandt i subst.exe.. Eksemplet laver et k: -drev som peger på c:\..

    if DefineDosDevice(0, 'K:', PChar('c:\')) then
        ShowMessage('Drev K oprettet')
    else
        ShowMessage('Fejl');
Avatar billede martinlind Nybegynder
19. februar 2002 - 14:05 #10
Ja så hedder det en driver !!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester