Tôi đã cố gắng để nắm bắt stdout và stderr đầu ra từ một DLL được biên soạn trong MSVC++ rằng ứng dụng Delphi tôi tĩnh liên kết đến, nhưng cho đến nay đã không thành công .Delphi - Capture stdout và đầu ra stderr từ liên kết tĩnh MSVC++ biên soạn DLL
procedure Test;
var
fs: TFileStream;
begin
fs := TFileStream.Create('C:\temp\output.log', fmCreate or fmShareDenyWrite);
SetStdHandle(STD_OUTPUT_HANDLE, fs.Handle);
SetStdHandle(STD_ERROR_HANDLE, fs.Handle);
dllFunc(0); // Writes to stdout in MSVC++ console app, but not here
// fs.Length is always zero
fs.Free;
end;
Tôi đã đi đúng hướng nhưng không hoạt động.
- Có phải SetStdHandle() đủ không?
- TFileStream có phù hợp để sử dụng ở đây không?
- Tôi có sử dụng TFileStream đúng cho SetStdHandle() không?
- Có thể DLL đặt bộ xử lý stdout/stderr của nó khi ứng dụng tải không? Nếu vậy, đâu là nơi tốt nhất để sử dụng SetStdHandle() hoặc tương đương?
Mọi trợ giúp sẽ được đánh giá cao.
fmShareDenyWrite không hoạt động với fmCreate - nó chỉ đơn giản là vô dụng. fmTạo hoặc fmShareDenyWrite = fmTạo. – kludg
Thú vị Serg, vâng tôi thấy rằng fmCreate có giá trị 0xFFFF mà sẽ làm cho bất kỳ chế độ chia sẻ cờ vô ích. Odd. – Atorian