0

我在 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;

但是当我尝试将 anil作为第二个参数传递时,它再次抱怨。

编辑1:

tlb 来自 Golez,作为对http://www.stackoverflow.com/questions/4184306的回答的一部分——上面的代码来自他的回答——这等同于我遇到的问题也让 adsi 工作。

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

编辑2:

我错误地认为问题出在函数上,因为我盲目地遵循了代码。在抛出一些错误陷阱之后,似乎从未创建过该对象,当我尝试为其赋值时,这当然会抛出 av 。

分配的答案,因为它是第一个指出显而易见的!

4

2 回答 2

3

如果它被定义为var参数,则意味着您应该只传递一个元素,并让 Pascal 处理指针。如果原始库需要一个数组,因为指针和数组在 C 中是可互换的,那么您的 TLB 翻译就做错了。

于 2010-11-22T13:42:46.007 回答
1

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

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

于 2010-11-22T12:54:43.633 回答