Hallo,
ich versuche mich gerade an einer Consolenanwendung.
Aus diversen Codeschnipseln habe ich das untenstehende zusammengesetzt.
Das Programm soll einen freien Laufwerksbuchstaben finden (das tut es auch) und
auf diesen Laufwerksbuchstaben ein Netzlaufwerk verbinden ein Programm ausführen
und danach das Laufwerk wieder trennen.
Problem ist, bei dem Versuch das Laufwerk anzubinden bekomme ich folgende Fehlermeldung:
D:\development\Delphi6\Projects\mountTool>netInsta ll
Exception EOSError in module mapfree.exe at 0000ACAA.
System Error. Code: 67.
Der Netzwerkname wurde nicht gefunden.
Nun, nach langem Suchen bin ich nicht fündig geworden wo das Problem liegt.
Ich kann von der Kommandozeile (DosBox) das Laufwerk mit den Parametern verbinden.
Es hilft auch nichts den Rechnernamen mit der IPAdresse auszutauchen.
Vielleicht was ja jemand von Euch einen Rat.
Grüße
Klaus
Delphi-Quellcode:
program netInstall;
{$APPTYPE CONSOLE}
uses
SysUtils,
windows,
shellAPI,Dialogs;
function DriveExists(DriveByte: Byte): Boolean;
begin
Result := GetLogicalDrives
and (1
shl DriveByte) <> 0;
end;
function DriveType(DriveByte: Byte):
String;
begin
case GetDriveType(PChar(Chr(DriveByte + Ord('
A')) + '
:\'))
of
DRIVE_UNKNOWN: Result := '
unbekannt';
DRIVE_NO_ROOT_DIR: Result := '
Laufwerk existiert nicht';
DRIVE_REMOVABLE: Result := '
Wechselmedium';
DRIVE_FIXED: Result := '
Festplatte';
DRIVE_REMOTE: Result := '
Netzwerk';
DRIVE_CDROM: Result := '
CD-ROM/DVD';
DRIVE_RAMDISK: Result := '
RAM Disk';
else
Result := '
anderer Laufwerkstyp';
end;
end;
function ConnectNetworkDrive(
const ADrive:
String;
const ADirectory, AUsername, APassword:
String;
const ARestoreAtLogon: Boolean ): Boolean;
var
NetResource: TNetResource;
dwFlags: DWORD;
lPwd, lUser: PChar;
begin
NetResource.dwType:=RESOURCETYPE_DISK;
NetResource.lpLocalName:=PChar(ADrive);
NetResource.lpRemoteName:=PChar(ADirectory);
NetResource.lpProvider:=nil;
if ARestoreAtLogon
then
dwFlags:=CONNECT_UPDATE_PROFILE
else
dwFlags:=0;
if AUsername<>'
'
then
lUser:=PChar(AUsername)
else
lUser:=nil;
if APassword<>'
'
then
lPwd:=PChar(APassword)
else
lPwd:=nil;
Result:=WNetAddConnection2(NetResource,
lPwd,
lUser,
dwFlags)=NO_ERROR;
end;
VAR
i:Byte;
found: Boolean;
drives:
Array[1..26]
of char;
freeDrive:
String;
begin
// init array
FOR i:=1
TO 26
DO
drives[i]:='
';
//mark any entry within the array which have a drive
FOR i:=1
TO 26
DO
begin
if driveExists(i)
THEN
drives[(i + Ord('
A')-ORD('
A'))]:='
x';
end;
// search for an available drive letter
i:=1;
found := false;
REPEAT
found := drives[i] = '
';
inc(i)
until (i > 26)
OR found;
freeDrive:=lowerCase(chr(ord('
A')+i-1))+'
:';
// map network drive to available drive letter
if ConnectNetworkDrive(freeDrive,'
\\mhhb2kpc.mchh1.siemens.de\TMSetup','
/user:mhhb2kpc.mchh1.siemens.de\TMSetup ','
@siemens01 ',false)
then
WriteLn('
Networkdrive connected')
else
begin
RaiseLastOSError;
end;
IF fileExists(freedrive+'
\test\project1.exe')
THEN
BEGIN
WinExec(PChar(freedrive+'
\test\project1.exe'),sw_show);
END;
// remove mapped network drive
shellexecute(0,'
open','
net',PChar('
use '+freedrive+'
/delete'),
nil,sw_hide);
{ TODO -oUser -cConsole Main : Insert code here }
end.