19. februar 2002 - 12:36Der 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..
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 }
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;
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;
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..
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..
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..
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');
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.