2014-02-11 2 views
2

Я пытаюсь реализовать указатель записи в Inno Setup (Unicode), чтобы соответствовать спецификациям Delphi DLL в ...Невозможно определить запись указатель

type 
    PUnzipFile = ^TUnzipFile; 
    TUnzipFile = record 
    Caption: WideString; 
    Src: WideString; 
    Dest: WideString; 
    Status: Integer; 
    Size: Integer; 
    ErrCode: Integer; 
    ErrMsg: WideString; 
    end; 
    TUnzipFiles = array of PUnzipFile; 

function UnzipFiles(var Files: TUnzipFiles; const Silent: Bool): Bool; 
    external '[email protected]:Unzipper.dll stdcall'; 

Проблема заключается в том, что компилятор не будет работать на линии PUnzipFile = ^TUnzipFile; потому что, по-видимому, Inno Setup не поддерживает указатели, как делает Delphi. Эта запись указатель отлично работает при реализации в Delphi ...

function UnzipFiles(var Files: TUnzipFiles; const Silent: Bool): Bool; stdcall; 
    external 'Unzipper.dll'; 

Как я могу работать с этой DLL, если программа установки Inno не поддерживает запись указателей?

+0

Для записи я изменил весь подход к проекту, так как я контролирую указанную DLL. Теперь Inno Setup вызывает процедуру 'UnzipperAddFile' с необходимыми параметрами, а затем' UnzipperGo', чтобы инициировать фактический процесс, а также обрабатывать 'UnzipperInit' и' UnzipperUnInit'. –

+0

Я все еще хотел бы знать, как я мог бы это сделать, используя эти указатели записи. –

+1

Вы пытались переместить объявление указателя после объявления записи? –

ответ

2

Нет необходимости в указателях.
Inno Setup Pascal Script не поддерживает указатели.

Оператор:

function UnzipFiles(var Files: TUnzipFiles; const Silent: BOOL): BOOL; external '[email protected]:Unzipper.dll stdcall';

Передает Files в качестве параметра вар, а это значит, что на самом деле прошло указатель на TUnzipFiles. Нет необходимости делать массив указателей TUnzipFiles.
Просто сделайте это обычным массивом, и все будет работать.

Решение просто использовать массив записи в вопрос:

TUnzipFiles = array of TUnzipFile; 

Теперь он будет работать.

Поскольку параметр var передает внутренний указатель, ваш вызов будет не медленнее (или быстрее).
Это красота Дельфы. Он скрывает сложность указателей почти во всех случаях, где это необходимо в C.
Все ссылки на объекты и параметры var действительно являются указателями, но вам не нужно об этом беспокоиться.

Смежные вопросы