Thanks Rob,
But actually, I did get one to work. It finally gelled for the following
code in my OnFormCreate handler:
D := GetStartDir;
ShellExecute( 0, 'open', PChar('command.com'),
PChar('/c '+'ipconfig/all > harbor.txt'),
nil, SW_HIDE );
Waiting := 100;
while ( (Waiting>0) and (not FileExists(D+'HARBOR.TXT')))
do begin
Sleep(250);
Waiting := Waiting-1;
end;
if (not FileExists(D+'HARBOR.TXT'))
then raise Exception.Create('Login Error 1.');
But there is still a problem. The 'Waiting' loop discovers that the
file exists, but not whether it has been completely written and let
loose to be read. In my OnFormActivate handler, I use:
if FirstActivation
then begin
D := GetStartDir;
Application.ProcessMessages;
Sleep(500);
if FileExists(D+'HARBOR.TXT')
then begin
meHarbor.Lines.LoadFromFile(D+'HARBOR.TXT');
which works MOST of the time. But occasionally, (5%) it causes
an exception related to trying to read a file that is still being written.
Does anyone have a way to determine whether the file HARBOR.TXT
has been released for reading after being completely written? I would
be able to fix this problem by replacing the Sleep(500) with a loop
that tests till the HARBOR.TXT file is ready.
Thanks,
Rich
Rob Kennedy wrote
> Rich Cooper wrote:
>> I'm trying to pipe a DOS command to a file using a ShellExecute,
>> but it doesn't create the output file. Here's the code:
>>
>> var D : string;
>> ...
>> D := GetStartDir;
>> ShellExecute(0,pChar('ipconfig/all >
>> '),pchar('harbor.txt'),nil,pChar(D),SW_SHOWNORMAL);
>> ...
>>
>> but no file named 'harbor.txt' gets created. Does anyone know how to
>> fix this?
>
> First, "ipconfig/all >" is not a shell verb. Did you read the
> documentation for ShellExecute before composing the code above?
>
> Second, you're telling ShellExecute to look in the registry for the
> "ipconfig/all >" key for files named *.txt, and then execute the command
> it finds there on the harbor.txt file, which I'm guessing doesn't even
> exist.
>
> Third, note that command-line redirection is performed by the
> command-line interpreter. ShellExecute is not a command-line
> interpreter. Read this:
>
> http://blogs.msdn.com/oldnewthing/archive/2006/05/16/598893.aspx
>
> You should be able to find lots of example code to solve your problem
> with the following search:
>
> http://groups.google.com/groups?q=pipe+dos+command&as_ugroup=*delphi*
>
> Fourth, ipconfig is not a DOS command. It's a console program, but it's
> a fully fledged Windows program. Try to run it in DOS (if you even have
> a computer with DOS installed anymore), and you'll simply be told that
> it needs to run in Win32 mode.
>
> Finally, type-casting a string literal to PChar is not necessary and can
> sometimes lead to problems. A string literal can be used as any
> string-related type, including AnsiString, WideString, PAnsiChar, and
> PWideChar. The compiler will choose based on what it needs. You don't
> need to tell it.
>
> --
> Rob
> _______________________________________________
> Delphi mailing list -> [email protected]
> http://www.elists.org/mailman/listinfo/delphi
>
_______________________________________________
Delphi mailing list -> [email protected]
http://www.elists.org/mailman/listinfo/delphi