問題タブ [ole-automation]
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.
winapi - WinApi (自動化) 関数 VarFormat (oleaut32.dll) を使用した後に値をアンフォーマットしますか?
VarFormat 関数 (oleaut32.dll) でフォーマットされた値をアンフォーマットすることはできますか?
機能説明:
vbscript - VBScript: ディスパッチ マップで母音を使用して定義された関数を呼び出す方法
Microsoft COM オブジェクトを作成する次の VBScript スクリプトがあります。
その COM オブジェクトの実装はFoo.dll
、Microsoft Foundation Framework (MFC) と特にDispatch Mapsのメカニズムを使用する Dynamic Link Library にあります。
ディスパッチマップはこのように表示されます
ここまでは順調ですね。Excel アプリケーションなどの VBA 環境でこのような COM オブジェクトを作成すると、呼び出しfoo.Einfügen
が成功します。VBScript-Script 以外。
VBScript だけでなく、VBA でもOLE Automationが適用されていることを認識しました。しかし、VBScript-Script を実行すると、エラーが発生しました
エラー: 不明な文字です。コード 8000A0408;
出典: Microsoft VBScript でのコンパイルの失敗
最初は文字のせいで VBScript-Script のエンコーディングが間違っていると思っていましたが、ü
ANSI エンコードされていることを確認しました。また、システムのWindows コード ページが西ラテン文字セットのWindows-1252であることも確認しました。
ディスパッチ マップでに変更Einfügen
するEinfuegen
と、VBScript スクリプトが機能していると断言できます。
私の質問は、foo.Einfügen
VBScript と VBA の呼び出しの動作が異なるのはなぜですか? この動作の理由は何ですか?
私にとっての回避策は、関数にDISP_FUNCTION
ディスパッチする Dispatch Map に 2 番目のエントリを追加することです。VBScript-Script I で呼び出し、VBA でまだ.Einfuegen
Insert
foo.Einfuegen
foo.Einfügen
c# - 保存されているはずのファイルが実際には保存されないのはなぜですか?
次のコードは、C# で Excel ファイルを作成して保存するために、このチュートリアルから取得したものです。
正常に動作しているようです。MessageBox msg が表示され、問題の兆候もなくステップスルーできます。ただし、ファイルはハード ドライブに保存されません。なぜだめですか?
c# - PerlNET を使用して C# から Perl に COM オブジェクトを渡す
C# コードから Perl に COM オブジェクトを渡そうとしています。
現在、Perl コードを PerlNET (PDK 9.4; ActiveState) でラップしており、C# からラップされた Perl モジュールにオブジェクトを渡すために、Perl で単純なサブルーチン (+ 必要なポッド宣言) を定義しました。
渡したオブジェクトが正しく COM オブジェクトとして認識されていないようです。
例:
C# (.NET 4.0) では、ScriptControl を使用して、VBScript で記述されたファイルから単純なクラスをロードします。
私が得るもの ( obj
) はタイプSystem.__ComObject
です。それを Perl/PerlNET アセンブリに渡し、Perl でメソッドを呼び出そうとするとXyz()
、次の (実行時) 例外が発生します。
ただし、Perl で多かれ少なかれ同じことを行うと、うまくいきます。(次のケースでは、.vbs ファイルの内容のみをパラメーターとして渡します。)スクリプト コントロールを使用することもできます。
これで、呼び出しは正常Xyz()
にobj
機能します (Win32::OLE を使用)。
どちらの場合も、次を使用します。
別のアプローチ:使用するオーバーロードと渡す型を正確に指定すると、of クラス
を使用してメソッドを呼び出すことができます。InvokeMember
System.Type
このアプローチを使用すると、ラップされた Perl モジュール全体を書き直すことになります。そして、この構文を使用して..
PerlNET と COM オブジェクトを使用することで、.NET 4.0 の dynamic キーワードの利点と Perl の動的な特性 (Win32::OLE を使用) の両方を失うのではないかと考えています。
dynamic
私の好みの解決策は、C#/.NET 4.0 のキーワードの動作を模倣する何らかの方法に集約されるようです。
または、渡された COM オブジェクトを と互換性があると認識されるものに変換する何らかの方法を見つけることをお勧めしWin32::OLE
ます。__ComObject
COMオブジェクトとして正しく識別されるように、の情報を抽出するかもしれません。
PDK ディスカッション サイトにも投稿したことを追加する必要があります (ただし、まだ応答がありませんでした): http://community.activestate.com/node/18247
PerlMonks にも投稿しました。これがPerlまたはC#/.NETの質問であるかどうかを確認してください:
http://www.perlmonks.org/?node_id=1146244
助けていただければ幸いです-または、さらに調べる場所についてアドバイスしてください。
winapi - POINTのセーフアレイを作成するには?
oleautomation タイプには、VT_xxx タイプがあります。
カスタム タイプの場合、IRecordInfo があります。
SafeArrayCreateEx(VT_RECORD, 1, &rgbounds, pRecInfo);
しかし、POINT などの Windows のシステム タイプに適したタイプは何ですか?