問題タブ [interopservices]

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.

0 投票する
1 に答える
1376 参照

c# - Windowsサービスのセッションハンドラーのロック/ロック解除でWtsApi32.dllを使用する方法は?

Windowsサービスを使用して、プログラム(Notepad.exeなど)を検出して閉じたい。以下のコードは、コンソールアプリケーションで選択するのに適しています。

しかし、上記のコードはWindowsサービスWindows 7では機能しません。このリンクを見てください:

http://social.msdn.microsoft.com/Forums/eu/netfxcompact/thread/04b16fac-043a-41c3-add9-482c912e95be

私は、Windows 7で実行されないWindowsサービスで以下のコードを記述しました。これは、コンソールアプリケーションのWindows7で毎回動作します。

この記事(http://rhauert.wordpress.com/category/ucc/)を読みましたが、使用できません

0 投票する
1 に答える
395 参照

c# - C#でDllImportの量を短くする?

これが私の C# コードのサンプルです。DllImport 属性の量を減らす方法はありますか?

0 投票する
1 に答える
205 参照

.net - System.Runtime.InteropServices.ClassInterfaceType 列挙に AutoUnknown 値がないのはなぜですか?

.NETのSystem.Runtime.InteropServices.ClassInterfaceType列挙にはAutoDispatch値と値AutoDualがありますが、値はありませんAutoUnknownなぜそうしないのですか? また、車輪を再発明する必要がないように、それを達成するためのかなり自動化された方法を誰かがすでに考え出していますか?

もう少し背景として、現在の列挙型の 3 つの値とその機能を次に示します。

  • ClassInterfaceType.Noneはクラス インターフェイスを作成しません。これは Microsoft の推奨値です。クラス インターフェイスがない場合は、意図するメンバーを使用して独自のインターフェイスを作成し、クラスにそれを実装させる必要があります。次に、インターフェイスでSystem.Runtime.InteropServices.ClassInterfaceAttribute属性を使用して、インターフェイスをディスパッチ インターフェイス (レイト バインド クライアントをサポート)、不明なインターフェイス (アーリー バインド クライアントをサポート)、またはデュアル (アーリー バインド クライアントとレイト バインド クライアントの両方をサポート) にすることができます。
  • ClassInterfaceType.AutoDispatchIDispatch明示的なメンバーなしでから派生したクラス インターフェイスを作成します。明示的なメンバーがない場合、遅延バインディングの呼び出し元のみをサポートできます。
  • ClassInterfaceType.AutoDualから派生したクラス インターフェイスを作成します。このインターフェイスは、IDispatchそのクラスのすべてのパブリック非静的メンバーの明示的なメンバーと、その基本クラスおよび実装されたインターフェイスのすべてのメンバーを持ちます。クラスのメンバーのいずれかが変更されると、クラス インターフェイスも変更されるという事実から生じる「バージョン管理の制限のため」、Microsoft はこの値の使用を強くお勧めしません。(そのため、クラスが変更された後に再バインドしない呼び出し元は、間違ったメソッドを呼び出したり、間違ったパラメーターを渡したりする可能性があります。)

だから私が疑問に思っているのは、クラスのメンバーを明示的に宣言するClassInterfaceType.AutoUnknown派生クラスインターフェイスを作成する値が呼び出されない理由ですIUnknown(基本クラスまたはそれが実装する他のインターフェイスではありません)。

私たちがClassInterfaceType.AutoDualDirectそれに取り組んでいる間、基本クラスのすべてのメンバーと実装されたすべてのインターフェイスを公開する代わりに、他のメンバーができるため、クラスの直接のメンバーのみを公開することを除いて、AutoDual に似たようなものがあることも期待できます。他の COM インターフェイスを介して取得できます。

それで、ここでの話は何ですか、何が欠けていますか?Microsoft が AutoDual を使用しないことを推奨していると言っているのは知っています。「バージョン管理の問題」があるからです。これらの懸念は AutoUnknown にもある程度当てはまります。しかし、その推奨にもかかわらず、彼らはまだAutoDualを持っています。彼らはなぜ AutoUnknown も持っていないのでしょうか?

これらの「バージョン管理の課題」について一言: これらの懸念事項の最も危険な側面は、遅延バインディングの呼び出し元にのみ適用されます。AutoUnknown は、派生IUnknownインターフェイスではなく、派生インターフェイスを生成するため、事前IDispatchにバインドされたクライアントが持つ可能性のあるバージョン管理の問題だけを気にする必要があります。また、自動生成されたクラス インターフェイスの IID は、クラスの public 非 static メンバーが変更されるたびに変更されるため、事前にバインドされたクライアントは既存のメンバーに対して「不適切な呼び出し」を行うことができず、単純に QueryInterface( ) クラス インターフェイスの場合。まだ失敗ですが、クラッシュなどではなく、管理可能なものです。これは、インターフェイスの変更を決して許可しないという COM の規則を破るものではありません。変わるのではなく、新しいインターフェース (新しい IID) になりつつあります。それはそう、IUnknownAutoDual メカニズムの半分 (派生メンバーを除く)。実際、AutoDual にはレイト バウンドの課題もすべて含まれているため、AutoDual よりも「バージョン管理の課題」が少なくなります。

繰り返しますが、AutoUnknown が存在しないのに、なぜ AutoDual が存在するのでしょうか。

実際の例をいくつか示すために、次の C# コードを検討してください。

次の idl を生成します。

それは問題ありませんが、代わりに AutoUnknown がこの idl を生成することをお勧めします。

これを自動的に行う方法がない場合は、リフレクションを使用してそれを行うものを作成する予定です。そのため、その面での推奨事項もいただければ幸いです。たとえば、メソッドで確認する必要がある属性はありますか? パラメータについて?私はそれがどのように機能するかを確認するために IL を掘り下げましたSystem.Runtime.InteropServices.TypeLibConverterが、残念ながらすべての機能は、私が取得できないプライベート internalcall nConvertAssemblyToTypeLib() 関数にあります。

ありがとう!

0 投票する
2 に答える
6426 参照

c# - const wchar_t* を C DLL から C# 文字列に自動的に変換する方法

それはただの好奇心です。おそらく、このようなことをした人がこの世界にいます:

C 関数をエクスポートし、DllImport を介して C# コードからロードする必要があります

そのための最善の方法は、広く推奨されていることですが、IntPtr を宣言してから、関数を使用して文字列に変換することです。言い換えれば、このようなもの

このアプローチは機能します。しかし、それを自動的に行う方法はありますか? SysGetLibInfo が文字列を返すようにするには? 次のような提案がいくつか見つかりました。

しかし、それは機能しません。さまざまな例と乏しいレポートによると、機能しないはずです。

IntPtr を文字列に変換する MarshalAs のような独自の属性を記述する方法はありますか? これに似たもの:

情報や有用なリンク、例、書籍について事前に感謝します。繰り返しますが、それはただの好奇心です。

PtrToStringUni を使用して結果を文字列に変換する別の関数で SysGetLibInfo をラップするという PS 提案はオプションではありません;)

0 投票する
1 に答える
1937 参照

c# - GetWindowText() 関数が常に正しく実行されない

Chrome ブラウズから URL を取得する小さなアプリケーションを作成しています。

最初に Chrome ブラウザーが開いているかどうかを確認するために、次のコードを使用します。

GetWindowText()関数を使用して Windows のタイトル テキストを取得していますが、そこで問題に直面しています。

Chrome ウィンドウに URL がなく、単なる New Tab である場合、問題はありません。 WindowTitleText.ToString() はNew Tab - Google Chromeと同じです。

ただし、Web ページを開くと、URL に何らかの URL が入力されている場合、GetWindowText() の行で ようになります 。ここに画像の説明を入力

どうしたの?

ヘルプ!

0 投票する
0 に答える
130 参照

c# - C#で構造体の配列を使用してアンマネージC ++コードを呼び出す

以下は、関数の私の C++ 宣言です。

以下は、私の C++ 構造定義です。

以下は、私の C# クライアント コードです。

ここで、構造体配列の値、つまりinputdesarray、outputdesarray、およびinterndesarray内の値を取得できません。

0 投票する
2 に答える
155 参照

c# - C# .Net 4.0 アプリケーションでホストされている C++ ActiveX コントロールでの Xml.Serializer の不正なキャスト例外

CLR が有効になっている C++ DLL を利用する C++ ActiveX コントロールをホストする C# .Net 4.0 アプリケーションがあります。DLL には、OCX のパラメーターをロードする主な機能があり、この目的のために XML.Serializer を使用します。

このスタックは、すべてのコンポーネントが MS Visual Studio .Net 2003 でビルドされ、C# アプリケーションが .Net 1.1 で実行されている場合に正常に機能します。

ただし、モジュール全体が VS2010 に移行され、アプリケーションが .Net 4.0 に移行されると、コンテキストが一致しないため、恐ろしい Xml.Serializer の不正なキャスト例外が発生します。

例外は 4 行目で発生します。

例外ステートメントは次のとおりです。

ParameterModule.ParaClass.execute_DeSerialize() で例外がスローされました。

「LoadNeither」コンテキストには、チルダ(~) 文字を含むロケーション パスがあることに注意してください。「デフォルト」コンテキストにはフルパスがあります。

ActiveX コントロールの相互運用 DLL は、VS2010 によって自動的に生成されます。

何が例外の原因なのだろうか。Pathの不一致ですか?よくわかりませんが、DLL が 1 回だけ読み込まれたと思います。

それとも文脈の不一致ですか?コンテキストの不一致が原因である場合、C++ ActiveX コントロールのような相互運用モジュールの読み込みコンテキストを確認するにはどうすればよいでしょうか? または、Xml.Serializer を指定して、Serializing クラスを含む DLL を既定のコンテキストで読み込むことはできますか?

私はいたるところを見てきましたが、解決策を見つけることができませんでした。インターネットを調べれば調べるほど、これは私にとって謎になります。前もって感謝します。

0 投票する
4 に答える
2065 参照

c# - ウィンドウから最小化、最大化、閉じるボタンを非表示にし、アイコンを表示します

ウィンドウの上部にある最小化、最大化、閉じるボタンを非表示にして、アイコンを表示しようとしています。

私はいくつかの異なることを試しましたが、アイコンを保持できません。これは私が取り組んでいるコードです:

どんな助けでも大歓迎です!ありがとう!