Использование импортированного TLB - ошибка «Типы фактических и формальных переменных должны быть идентичны» - PullRequest
0 голосов
/ 22 ноября 2010

У меня проблемы с использованием импортированной библиотеки типов в Delphi 2010, и я не могу понять, как ее исправить.

ActiveDs_TLB определяет следующее:

function SetSearchPreference(var pSearchPrefs: ads_searchpref_info; dwNumPrefs: LongWord): HResult; stdcall;

Я предполагаю, что для этого требуется указатель на массив ads_searchpref_info, но я не могу сделать следующее:

SetSearchPreference(@MySearchPref,1);

потому что тогда я вижу страшную E2033 Types of Actual and formal var parameters must be identical ошибку

Далее, ActiveDs_TLB определяет:

    function ExecuteSearch(pszSearchFilter: PWideChar; var pAttributeNames: PWideChar; 
                       dwNumberAttributes: LongWord; out phSearchResult: Pointer):HResult; stdcall;

но затем, когда я пытаюсь передать nil в качестве второго параметра, он снова жалуется.

Редактировать 1:

Tlb от Голеза как часть ответа на http://www.stackoverflow.com/questions/4184306 - приведенный выше код от его ответа - это равносильно проблемам, с которыми я также столкнулся, заставляя adsi работать.

Я использую 64-битный W7 - это не должно иметь никакого значения, так как adsi dll 32-битный.

Редактировать 2:

Я ошибочно предположил, что проблема была в функции из-за ошибки, возникающей там, потому что я слепо следовал коду. После добавления нескольких ловушек ошибок кажется, что объект никогда не создается, что, конечно, выдает av, когда я пытаюсь присвоить ему значение.

Ответ назначен, так как он первым указал на очевидное!

Ответы [ 2 ]

3 голосов
/ 22 ноября 2010

Если он определен как параметр var , это означает, что вы должны передать только один элемент и позволить Pascal позаботиться об указателе. Если исходная библиотека ожидает массив, потому что указатели и массивы взаимозаменяемы в C, то ваш перевод TLB был выполнен неправильно.

1 голос
/ 22 ноября 2010

Первый принимает параметр типа ads_searchpref_info.Вероятно, это не указатель.

На 2-м, так как это параметр var, вы не можете передавать константу, это должна быть переменная, поскольку ожидается, что она сможет изменить ее / передать информациюотступить.

...