Значит ситуация такая: Изучаю работу ББ с Виндой. Нужно вызывать ДЛЛки написанные в Си. Делфи и т.д.
Пока моделирую ситуацию, чтоб понять как и чего.
Допустим есть ДЛЛ
Код:
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
Вот мне и интересно что это может быть. Где я напортачил...