Последняя версия DataExpress 3 beta от 2 ноября 2018 года. Скачать. Энциклопедия DX. Форум на Develop-Soft

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

Вопросы, касающиеся языка, синтаксиса.
Аватара пользователя
Гocть
Эксперт
Сообщения: 1265
Зарегистрирован: Пн ноя 27, 2017 8:02 am

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

Сообщение Гocть » Пт авг 31, 2018 4:21 pm

Имеется некий работающий код 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;

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

Аватара пользователя
admin
Разработчик
Сообщения: 3898
Зарегистрирован: Пн мар 14, 2016 11:32 am
Откуда: Ленинградская

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

Сообщение admin » Пт авг 31, 2018 6:46 pm

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

Аватара пользователя
Гocть
Эксперт
Сообщения: 1265
Зарегистрирован: Пн ноя 27, 2017 8:02 am

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

Сообщение Гocть » Пт авг 31, 2018 7:27 pm

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 все пихать?

Аватара пользователя
admin
Разработчик
Сообщения: 3898
Зарегистрирован: Пн мар 14, 2016 11:32 am
Откуда: Ленинградская

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

Сообщение admin » Пт авг 31, 2018 8:36 pm

Если приглядеться Buffer без типа.

Аватара пользователя
Гocть
Эксперт
Сообщения: 1265
Зарегистрирован: Пн ноя 27, 2017 8:02 am

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

Сообщение Гocть » Пт авг 31, 2018 8:48 pm

Тоже обратил внимание, но подумал что это такая фишка ide. Что это может значить?
Фрилансер. Разработка на заказ. Консультирование.

Аватара пользователя
admin
Разработчик
Сообщения: 3898
Зарегистрирован: Пн мар 14, 2016 11:32 am
Откуда: Ленинградская

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

Сообщение admin » Пт авг 31, 2018 9:04 pm

Ну тут например можно почитать (первое, что нашел).

Аватара пользователя
Гocть
Эксперт
Сообщения: 1265
Зарегистрирован: Пн ноя 27, 2017 8:02 am

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

Сообщение Гocть » Пт авг 31, 2018 9:21 pm

Легче не стало увы :( . В ide процедура с формальным типом компилируется без проблем а DX исправно сообщает: ':' expected
Как же этот Dword-Pointer победить то?
Фрилансер. Разработка на заказ. Консультирование.


Вернуться в «Язык программирования RemObject Pascal Script.»