Страница 1 из 1

Чем заменить указатель?

Добавлено: Пт авг 31, 2018 4:21 pm
Гocть
Имеется некий работающий код Delphi, который хотелось бы портировать в программу. Есть правда одна загвоздка: непонятно как в DX передавать указатель на адрес строки:

Код: Выделить всё

function WriteFile(
          hFile: THandle;
{ >> }  const Buffer,
          nNumberOfBytesToWrite: cardinal;
          var lpNumberOfBytesWritten: cardinal;
          lpOverlapped: variant): boolean;  // POverlapped
external 'WriteFile@kernel32 stdcall';


Buffer был dword, стал cardinal
именно в него требуется передать указатель:

Код: Выделить всё

procedure Test(S: String);
Writed: Cardinal;
begin
   WriteFile(F, PChar(S)^, Length(S), Writed, null);
end;

Каким способом это можно сделать в программе?

Re: Чем заменить указатель?

Добавлено: Пт авг 31, 2018 6:46 pm
admin
Там не DWORD, а LPCVOID, вроде как (https://docs.microsoft.com/en-us/windows/desktop/api/fileapi/nf-fileapi-writefile). Попробуйте String, по крайней мере в TStream.Write, где параметр в Lazarus не имеет типа, именно String.

Re: Чем заменить указатель?

Добавлено: Пт авг 31, 2018 7:27 pm
Гocть
admin писал(а):Там не DWORD, а LPCVOID, вроде как

В исходниках такое:
function WriteFile(hFile: THandle; const Buffer; nNumberOfBytesToWrite: DWORD; var lpNumberOfBytesWritten: DWORD; lpOverlapped: POverlapped): BOOL; external 'kernel32' name 'WriteFile';, но фактически работает как Pointer.
admin писал(а):Попробуйте String

Не вышло :( . Как только меняю указатель на string, функция перестает работать. Неужели из за одного параметра в dll все пихать?

Re: Чем заменить указатель?

Добавлено: Пт авг 31, 2018 8:36 pm
admin
Если приглядеться Buffer без типа.

Re: Чем заменить указатель?

Добавлено: Пт авг 31, 2018 8:48 pm
Гocть
Тоже обратил внимание, но подумал что это такая фишка ide. Что это может значить?

Re: Чем заменить указатель?

Добавлено: Пт авг 31, 2018 9:04 pm
admin
Ну тут например можно почитать (первое, что нашел).

Re: Чем заменить указатель?

Добавлено: Пт авг 31, 2018 9:21 pm
Гocть
Легче не стало увы :( . В ide процедура с формальным типом компилируется без проблем а DX исправно сообщает: ':' expected
Как же этот Dword-Pointer победить то?