bobby wrote:
Hi everyone,
I'm stuck with an assignment for my studies.
My assignment is to make a GUI for a disassembler.
Now, the professor want it to be multi-platform (Win32/Linux).

I saw a output-redirection example in Lazarus WIKI (one with memory stream), but the problem is that it's limited to very small amount of data. I don't have a clue how to make it to deal with more amount of data. I've try to clean the memory stream when it's going to be full, but it seems that I didn't do it like it should be done.

The example from wiki is at:
http://wiki.lazarus.freepascal.org/index.php/Executing_External_Programs

Can somebody help me with redirecting the output to SynMemo component? I need it to work on both Win32 and Linux.

As for now, the following lines gives me 106kb (same amount like example from the wiki), but the output should be 800kb (amount of data from 'disasm.exe test.exe > output.txt').

  with TProcess.Create(self) do begin
  Options := [poUsePipes];
  CommandLine := 'disasm.exe test.exe';
  Execute;

  while running do
  begin
       S := TStringList.Create;
       S.LoadFromStream(OutPut);
       for n := 0 to S.Count - 1 do
       SynMemo1.Lines.Add(S[n]);
       S.Free;
  end;

After a lot of experimenting, only clue a got is that the pipes are somehow limited, not the other components. The previous example has proved that the StringLists are not the ones who make that limitation (created and destroyed on every cycle of the loop).
Where is the problem?

Thanks in advance for every clue/advice you can give me.
If someone can give me the example of executing the external file, and redirecting the stdout to text file, also, working on both Win and Lin, that will also solve my problem.


On the page [http://wiki.lazarus.freepascal.org/index.php/Executing_External_Programs] the example "Reading large output" looks suited for reading large data. Are you sure you're using the exact code from this example, and you still don't get the full output ?

In particular, see the section "// read last part" in that example: when program ends, you must read remaining data from the pipe. This is something that is missing from your snippet above: you do

  while running do
  begin
    ... read next chunk from Output ...
  end;

but *after* this loop terminates (when Running = false) you must remember to read the rest of Output. In other words, the process may (and often will) terminate *before* you finished reading the pipe.

Michalis

_________________________________________________________________
    To unsubscribe: mail [EMAIL PROTECTED] with
               "unsubscribe" as the Subject
  archives at http://www.lazarus.freepascal.org/mailarchives

Reply via email to