3

タイプライブラリ(ハードウェアSDKの一部)からインポートしたCOMインターフェイスのメソッドの一部は、タイプIUnknownの値を返すか受け取ります。例として、SDKドキュメントは次のようにメソッドを指定します。

bool SetInput1Selection(InputSelection inputSelection)
InputSelection GetInput1Selection()

しかし、Delphiはこれらのメソッドを次のようにインポートしました。

function SetInput1Selection(const inputSelection: IUnknown): WordBool; safecall;
function GetInput1Selection: IUnknown; safecall;

InputSelection型は単純な整数型または列挙型のようですが、どこにも指定されていません。ドキュメントには、14の異なる可能な値とその意味の表のみが記載されています。

理想的には、自分のタイプを宣言したいと思います。

TInputSelection = (isCustom, isStartReset, ...)

タイプライブラリがこれらの関数を定義する方法は次のとおりです。

virtual HRESULT __stdcall SetInput1Selection (/*[in]*/ IUnknown * inputSelection, /*[out,retval]*/ VARIANT_BOOL * pRetVal ) = 0;
virtual HRESULT __stdcall GetInput1Selection (/*[out,retval]*/ IUnknown * * pRetVal ) = 0;

しかし、どうすればこれを機能させることができますか?

4

1 に答える 1

3

整数/列挙型とインターフェイスはTypeLibraryで異なる方法で記述されるため、TypeLibraryインポーターがそれらを混乱させる可能性はほとんどありません。私の推測では、これはInputSelection実際には他のデータをラップするインターフェイスタイプであり、そのデータにアクセスするための独自のプロパティ/メソッドを持っている可能性があります。ithatインターフェイスがTypeLibraryに表示されない場合は、プライベートインターフェイスである可能性があります。

あなたが試すことができる一つのことは、それがインターフェースを要求QueryInterface()することIUnknownGetInput1Selection()返すことを呼び出すことです。IDispatchそれがクラッシュした場合、IUnknownは有効なインターフェイスポインタではなく、インポートが正しくない可能性があります。ただし、クラッシュしない場合、特にQueryInterface()成功した場合は、実際のインターフェイスである可能性があります。IDispatch.GetTypeInfo()含まれている場合は、それ自体が説明されているかどうかを確認するために呼び出します。その場合、インターフェイスが実装するすべてのプロパティとメソッド(パラメーターを含む)を見つけることができます。一部の環境では、IDispatchベースのオブジェクトが整数のようにPOD値の単なるラッパーである場合、通常はプロパティがあり、そのようなプロパティにアクセスするためValueの特別なものもあります(実際の数は思い出せません。調べなければなりません)。DISPIDIDispatch.Invoke()DISPID

更新:Nanotecステッピングモーターをプログラミングしている可能性はありますか?あなたが言及した機能に似たドキュメントをオンラインで見つけました:

GetInput1Selection
    Definition:
        InputSelection GetInput1Selection()

This function outputs the function for digital input 1.
The function corresponds to serial command ':port_in_a'.

SetInput2Selection
    Definition:
        bool SetInput2Selection(InputSelection inputSelection)

This function sets the function for digital input 2.
The value returned by the function can be used to check that the command was correctly recognized by the controller.
The function corresponds to serial command ':port_in_b'.

InputSelection残念ながら、それは実際に何であるかを説明していません。

于 2012-12-16T19:23:49.320 に答える