代码之家  ›  专栏  ›  技术社区  ›  Mark Robinson

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

  •  0
  • Mark Robinson  · 技术社区  · 14 年前

    我在Delphi2010中使用一个导入的类型库时遇到了问题,而且我一辈子都不知道如何修复它。

    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 错误

    再往下, 活动的 定义:

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

    但是当我试图通过 nil 作为第二个参数,它再次抱怨。

    编辑1:

    tlb来自戈雷斯,作为 http://www.stackoverflow.com/questions/4184306 -上面的代码是从他的答案-这相当于我的问题也得到adsi的工作。

    我正在使用W7 64位-这不应该有什么区别,因为adsi dll是32位的。

    编辑2:

    我错误地认为问题出在函数上,因为我盲目地遵循代码,所以出现了错误。在抛出几个错误陷阱之后,似乎这个对象从未被创建,当然,当我试图给它赋值时,它会抛出av。

    因为这是第一个指出明显问题的答案!

    2 回复  |  直到 14 年前
        1
  •  1
  •   Donnie    14 年前

    第一个接受类型为的参数 ads_searchpref_info . 这可能不是指针。

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

        2
  •  3
  •   Mason Wheeler    14 年前

    如果它被定义为 风险价值 参数,这意味着您应该只传递一个元素,并让Pascal来处理指针。如果原始库需要一个数组,因为指针和数组在C中是可互换的,那么TLB转换是错误的。

    推荐文章