Форум: "Основная";
Текущий архив: 2003.12.19;
Скачать: [xml.tar.bz2];
Внизc2pascal Найти похожие ветки
← →
Vad1 (2003-12-08 14:36) [0]Глубоковажаемые знатоки PASCAL
Есть описание С функции.
Как перевести это на PASCAL.
int c_function(int Number, char **ArgumentVector, FILE *Input, FILE *Output, FILE *Error)
(FILE из stdio.h)
← →
PVOzerski (2003-12-08 14:50) [1]function c_function(Number:integer;var ArgumentVector:pChar;var Input,Output,Error:integer):integer;cdecl;
← →
Vad1 (2003-12-08 15:11) [2]Спасибо PVOzerski
Что передать в качестве FILE *Input, FILE *Output, FILE *Error ?
C-ая программа обычно передает stdin,stdout,stderr
← →
PVOzerski (2003-12-08 15:15) [3]Если это Windows, есть WinAPI-функция GetStdHandle.
← →
Vad1 (2003-12-08 15:25) [4]Спасибо PVOzerski.
Я наверное ошибаюсь, но все таки:
FILE *Input
Input это указатель на стуктуру FILE(stdio),
а GetStdHandle(...) возвращает некий Handle,
правомерно-ли передавать его в функцию?
← →
Vad1 (2003-12-08 15:25) [5]Спасибо PVOzerski.
Я наверное ошибаюсь, но все таки:
FILE *Input
Input это указатель на стуктуру FILE(stdio),
а GetStdHandle(...) возвращает некий Handle,
правомерно-ли передавать его в функцию?
← →
PVOzerski (2003-12-08 15:56) [6]2Vad1:
Похоже, что Вы правы больше меня...
Я посмотрел, как описан тип FILE в MinGW32 и BC5.5 - он выглядит там по-разному. Но вот код, который у меня милостиво согласился работать:
function fprintf(var f;s:pchar):longint;cdecl;
external "crtdll.dll";
function fopen(name,mode:pChar):pointer;cdecl;
external "crtdll.dll";
function fclose(var f):longint;cdecl;
external "crtdll.dll";
var
f:pointer;
begin
f:=fopen("1","w");
fprintf(f^,"!!!");
fclose(f^);
end.
Так что структуру эту сделать-таки можно средствами системных библиотек Windows (в данном случае - crtdll.dll, подойдет и msvcrt(xx).dll). Только си-шный код должен быть скомпилирован с ориентацией на использование этих же библиотек (VC или MinGW32). И еще покаюсь: все-таки структура - не integer, так что лучше так:
function c_function(Number:integer;var ArgumentVector:pChar;var Input,Output,Error):integer;cdecl;
← →
PVOzerski (2003-12-08 16:09) [7]Продолжая изыскания:
в той же crtdll.dll имеется экспортируемый указатель на массив из 3 файлов под названием _iob. Правда, силами Delphi до него, пожалуй, не добраться. Но можно либо сделать враппер на Си, либо попробовать использовать FreePascal. Последнее сейчас и испытаю...
← →
PVOzerski (2003-12-08 16:18) [8]Вот эта прога (FreePascal) вывела мне !!! на STDERR средствами crtdll.dll:
const
STDIN_FILENO=0;
STDOUT_FILENO=1;
STDERR_FILENO=2;
type
tCfile=packed record
_ptr:pointer;
_cnt:longint;
_base:pointer;
_flag,_file,_charbuf,_bufsiz:longint;
_tmpfname:pChar
end;
var
_iob:array[STDIN_FILENO..STDERR_FILENO]of tCfile;
external "crtdll.dll" name "_iob";
function fprintf(var f;s:pchar):longint;cdecl;
external "crtdll.dll";
function fopen(name,mode:pChar):pointer;cdecl;
external "crtdll.dll";
function fclose(var f):longint;cdecl;
external "crtdll.dll";
var
f:pointer;
begin
f:=@_iob[2];
// f:=fopen("1","w");
fprintf(f^,"!!!");
fclose(f^);
end.
← →
Vad1 (2003-12-08 16:57) [9]PVOzerski
Огромное Спасибо.
Буду пробовать.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.12.19;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.009 c