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;

しかしnil、2番目のパラメーターとしてaを渡そうとすると、再び文句を言います。

編集1:

tlbはhttp://www.stackoverflow.com/questions/4184306への回答の一部としてGolezからのものです-上記のコードは彼の回答からのものです-これは私がadsiを機能させるために持っていた問題と同じです。

私はW764ビットを使用しています-adsidllは32ビットなので、違いはありません。

編集2:

私は盲目的にコードをたどったので、そこでヒットしたエラーのために問題が関数にあると誤って思いました。いくつかのエラートラップをスローした後、オブジェクトが作成されていないようです。もちろん、オブジェクトに値を割り当てようとすると、avがスローされます。

明らかなことを最初に指摘したので、答えが割り当てられました!

4

2 に答える 2

3

varパラメーターとして定義されている場合は、単一の要素のみを渡し、Pascalにポインターを処理させる必要があることを意味します。元のライブラリが配列を予期している場合、ポインターと配列はCで交換可能であるため、TLB変換が正しく行われていません。

于 2010-11-22T13:42:46.007 に答える
1

最初のものはタイプのパラメータを取りますads_searchpref_info。これはおそらくポインタではありません。

2つ目はvar、定数を渡すことができないパラメーターであるため、定数を変更したり情報を戻したりできることを期待しているため、変数である必要があります。

于 2010-11-22T12:54:43.633 に答える