問題タブ [idispatch]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
com - COM は複数のデュアル インターフェイスをサポートしていますか?
複数のデュアル インターフェイスを持つ COM オブジェクトを作成しました。以前のバージョンのコンパイラでは機能しましたが、現在のバージョンでは機能しませんでした。
私の質問: COM の仕様では、これが機能するはずである (したがって、コンパイラのバグを報告する必要がある) と書かれていますか、それとも機能するように意図されていませんか? このページは、おそらく機能しないことを示唆しています。
RIDL ファイル:
それにアクセスするためのコード (これは疑似コードです。「実際の」コードには、HRESULT
s を表示するための追加のステートメントがあります):
したがって、問題は、が とibar
まったく同じように動作することintf
です。ibar
それを呼び出した可能性がありますが、何がfoo_method
何であるかを知らないようですbar_method
。
GetIDsOfNames
2 番目の呼び出しで が呼び出され0
、次に Invoke で が呼び出さbar_method
れ、3 番目の GetIDsOfNames で が呼び出されることを期待していました0x80020006
。
コンパイラに関する追加情報 (ただし、明確にするために、私の質問は、COM 仕様が動作するはずであると述べているかどうかです): BDS 2006 で動作し、C++Builder XE5 では動作しません。COM を実装する XE5 のコードを調べてみると、オブジェクトが最初に作成されたときにojbect ファクトリが using を埋めITypeInfo *
ますが、の実装はすべての結果に対して同じものを使用するだけで、 new で再度呼び出すことはありません。これはの実装で に渡されます。GetTypeInfoOfGUID(CLSID_....)
QueryInterface
ITypeInfo
GetTypeInfoOfGUID
IID
ITypeInfo
DispGetIDsOfNames
IDispatch::GetIDsOfNames
vba - ATL によって作成された COM インターフェイスは IDispatch を継承しますが、レイト バインディングは機能しません
これは私の IDL ファイルです。IFrame はデュアル インターフェイスであり、IDispatch と IUnknown の両方を継承します。
そして、これは IFrame を実装すると想定される CFrame クラスの宣言です。
COM サーバーが登録され、VBA で Frame オブジェクトを使用すると正常に動作しますが、早期バインディングによって動作します。このオブジェクトを VBScript で使用したいので、レイト バインディングが必要です。
ただし、遅延バインディングは実行できません。状況を調べたところ、ATL (および IDispatchImp クラス) が IDispatch に必要なすべての実装を行っているようです。これにより、オートメーション ツール (VBScript など) でオブジェクトを使用できるようになります。
ただし、実際には、スクリプトは「Active X コントロールを作成できません」というエラーを出します。アーリー バインディングを試してみると、VBA でも同じです。
私は何を間違っていますか?Windows 7 64 ビットで Visual Studio 2012 を使用していますが、COM サーバーは 32 ビットです (システムに登録されています)。
c++ - DLL スレッド コールバックは正常に動作しますが、コールバックが InvokeHelper を呼び出すとアクセス違反が発生します
USB デバイスをポーリングするスレッドを起動する DLL を作成しました。DLL が USB デバイスからメッセージを取得すると、コールバック関数が呼び出されます。
この dll をコードで使用するには、DLL からクラスのインスタンスを作成し、そのクラスのメソッドを呼び出してコールバック関数を設定し、スレッドを開始して、USB デバイスが何かを行うたびにコールバックが発生するようにします。動作すると、コールバックが発生します (これはキーパッド デバイスであるため、LPCSTR の形式でキー押下を送信するだけです) が、このキー押下値を内部関数に渡すと、アクセス違反が発生します。同じ値でこの関数を呼び出す他のものは問題なく動作します。
これは、アクセス違反を引き起こす行です
関数を含む:
DLL セット コールバック:
DLL 開始スレッド:
DLL メッセージ スレッド:
c# - Com インターフェイス タイプが IDispatch の場合のデフォルト プロパティ
ac# com インターフェイスでは、このようなデフォルト メンバーを定義できます。
IDispatch (またはデュアル) を使用すると、すべてが期待どおりに機能し、VBA からは次のようにプロパティを省略できます
しかし、インターフェイスを IUnknown としてのみ定義すると、機能しません。Excel オブジェクト ブラウザでは、「青い点」でマークされ、「既定のメンバー」というラベルが付いたプロパティがまだ表示されます。ただし、.Item は VBA コードで明示的に指定する必要があります。
IUnknown の既定のプロパティを IDispatch のように動作させる方法はありますか?
java - BSTR* の OleAutomation オブジェクト メソッドを呼び出す方法は?
タイプ ライブラリから取得した IDispatch インターフェイスを次に示します。
ここに私のJavaコードがあります:
出力は次のとおりです。
name
実行可能ファイルが開きますが、失敗することがわかるように、私が望むことはしませんrgdispidNamedArgs
。
これは実際に動作する Perl の等価物です:
私はJavaで初めてOleAutomationを使用していますが、インターネット上でその例を見つけることはほとんどありませんでした.これが唯一の違いのようで、うまくいきません。理由はわかりません。CallSet メソッドは、20-30 などのさまざまな設定/呼び出しに使用されますが、特に"Call_setCallDistance"に関心があります。お手にとって頂けたら嬉しいです!