使用导入的TLB - “实际和正式Var参数的类型必须相同”错误

时间:2010-11-22 12:36:00

标签: delphi delphi-2010 adsi

我在使用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来自Golez作为http://www.stackoverflow.com/questions/4184306答案的一部分 - 上面的代码来自他的答案 - 这相当于我已经让adsi工作的问题。

我使用的是W7 64位 - 因为adsi dll是32位,所以不应该有所作为。

编辑2:

我错误地认为问题出在该函数上,因为我遇到了错误,因为我盲目地遵循了代码。抛出几个错误陷阱后,似乎永远不会创建对象,当我尝试为其赋值时,这当然会抛出av。

指派的答案是第一个指出明显的答案!

2 个答案:

答案 0 :(得分:3)

如果它被定义为 var 参数,则意味着您应该只传递一个元素,并让Pascal处理指针。如果原始库期望一个数组,因为指针和数组在C中是可以互换的,那么你的TLB转换是错误的。

答案 1 :(得分:1)

第一个采用ads_searchpref_info类型的参数。这可能不是指针。

在第二个,因为它是一个var参数,你不能传递一个常量,它必须是一个变量,因为它希望能够更改它/传递信息。