Значит ситуация такая: Изучаю работу ББ с Виндой. Нужно вызывать ДЛЛки написанные в Си. Делфи и т.д.
Пока моделирую ситуацию, чтоб понять как и чего.
Допустим есть ДЛЛ
Код:
library Project1;
uses sharemem,
SysUtils,
windows,
Classes;
{$R *.res}
{$o-}
procedure ir(var buffer:pchar);
var s:string;
begin
buffer:='1234';
end;
exports ir;
begin
end.
Местные подсказали описать модуль импорта, что я и сделал
Код:
MODULE Dll["c:\temp\Project1.dll"];
IMPORT SYSTEM,WinApi;
TYPE
PROCEDURE GetBuffer* ["ir"] (VAR lpszAgent:WinApi.PtrSTR);
END Dll.
Тут все нормально.
Теперь юзаю функу ДЛЛки:
Код:
MODULE m;
IMPORT Dll,WinApi,StdLog,ComTools;
PROCEDURE a*;
VAR s:WinApi.PtrSTR;i:INTEGER;
c:SHORTCHAR;
BEGIN
StdLog.Clear;
s:=ComTools.NewEmptySString(6);
Dll.GetBuffer(s);
i:=WinApi.GetLastError();
IF i#0 THEN
StdLog.String('Ошибка № ');StdLog.Int(i);StdLog.Ln;
ELSE
StdLog.Int(LEN(s$));StdLog.Ln;
FOR i:=0 TO LEN(s$)-1 DO
c:=s[i];
StdLog.Char(c);
END;
END;
ComTools.FreeSString(s);
END a;
END m.
Тут тоже норм, спасибо Петру.
Вопрос только в том верно ли я освобождаю память через ComTools.FreeSString(s); ибо на ней выпадает ошибка
Цитата:
illegal memory read
Хотя читается строка из буфера, скормленного ДЛЛке нормально
Некоторые функции примерно такой спецификации
Код:
BOOL ReadFile(
__in HANDLE hFile,
__out LPVOID lpBuffer,
__in DWORD dwNumberOfBytesToRead,
__out LPDWORD lpdwNumberOfBytesRead
);
Которые мне придется юзать (Это из самописной ДЛЛ) выдают ошибку
Цитата:
ERROR_INVALID_PARAMETER
87 (0x57)
Поэтому я и хочу научиться на примерах, пока на своих, а потом дальше в лес.
Описываю я ее в модуле так:
Код:
PROCEDURE Read* ["ReadFile"](
hFile:WinApi.PtrVoid;OUT lpBuffer:WinApi.PtrSTR;dwNumberOfBytesToRead:LONGINT;OUT lpdwNumberOfBytesRead:LONGINT
):BOOLEAN;
И вызываю примерно так как показал в своем примере, передавая туда переменку s:WinApi.PtrSTR, для которой была зарезервирована память через ComTools.NewEmptySString
Вот мне и интересно что это может быть. Где я напортачил...