コードの検査とレビューから、不足しているメソッドをようやく見つけました。OpenService()
Visual Studio 2005 ATL インターフェイス ウィザードが適切に作成しなかったメソッドが 1 つ不足していることが判明しました。これは、サービス オブジェクトのインターフェイスに最初に追加されたメソッドであった可能性があります。
Visual Studio クラス ウィザードを使用してこのメソッドをインターフェイスに追加しようとしたときに、メソッド シグネチャをウィザード ダイアログに入力して [次へ] ボタンを押すと、ウィザードはエラー メッセージを発行しました。
新しい ATL プロジェクトで最初から再試行すると、エラー ダイアログに次のテキストが表示されました。
コード要素 'OpenServiceW' が読み取り専用であるため、追加/削除操作は不可能です。
メソッドをクリックすると、クラス ビューの Visual Studio UI にメソッドが表示されましたが、.idl ファイルのインターフェイス定義はそれを空として示しました。
interface IVirtSo : IDispatch{
};
Visual Studio を閉じてからプロジェクトを再度開き、今回はエラー メッセージを取得して再度追加しようとしました。
新しいコード要素を返すことができませんでした。構文エラーの可能性があります。新しい要素名: OpenService
さらに調査したところOpenService()
、Windows API にメソッドが存在することがわかりました。Visual Studio 2005 で、このメソッドをサービス オブジェクトに追加しようとしたことと、Windows API に存在するメソッドとの間で競合が発生した可能性があります (実際の名前は のようですOpenServiceW()
)。
私が最終的にやったのはCheckService()
、クラスウィザードを使用して名前を付けた同じシグネチャを持つインターフェイスメソッドを追加し、生成されたコードに存在するすべてのインターフェイスメソッド名を、名前またはラベルの一部でOpenService()
あるいくつかの場所を含むように変更することでしたCheckService
. 何らかの理由で、Visual Studio クラス ウィザードはOpenService()
、実際には存在しないのに、 のインターフェイス メソッドが存在すると考えていました。
ただし、これを成功させる前に、まず Visual Studio を終了してから、Intellisense ファイル (.ncb ファイルと .suo ファイル) を削除して、クラス ビュー ウィザードを使用して新しいメソッドを追加することが適切に機能するようにする必要がありました。ファイルを削除する前に、メソッドの追加が失敗しても、ウィザードの [追加] -> [メソッド] の ID 番号が増え続けていました。Intellisense ファイルを削除した後、ID 番号は再び 1 から始まりCheckService()
、ウィザードを使用してメソッドを追加し、[OpenService()
大文字と小文字を区別] をオンにして [単語全体を一致] をオンにして検索ツールを使用してメソッド名を手動で変更することができました。オフ。
これまでに確認できる唯一の方法は、サービス オブジェクトのソース コード実装に対して OPOS サービス オブジェクトの仕様を確認することです。
メソッドが OPOS サービス オブジェクトにないことを見つけるための他の可能な解決策を探しています。
この記事と私の現在の経験から、サービス オブジェクトを適切にロードするために OPOS サービス オブジェクトで使用可能にする必要がある一般的なメソッドのサブセットは次のようになります。これらのいくつかは、サービス オブジェクトの起動と初期化の一部として 1 回だけ呼び出されます。GetPropertyNumber()
これらの SET バージョンなどのその他GetPropertyString()
のものは、サービス オブジェクト環境のセットアップの一環として複数回呼び出すことができます。サービス オブジェクト内に対応するメソッドを持つ必要がある特定のデバイス タイプに対して、特定の OPOS Common Controls オブジェクトによって提供される他のエントリ ポイントが存在する場合があります。
HRESULT OpenService(BSTR DeviceClass, BSTR DeviceName, IDispatch* pDispatch, [out, retval] long* pRC);
HRESULT CheckHealth(long Level, [out, retval] long* pRC);
HRESULT ClaimDevice(long ClaimTimeout, [out, retval] long* pRC);
HRESULT ClearInput([out, retval] long* pRC);
HRESULT CloseService([out, retval] long* pRC);
HRESULT COFreezeEvents(VARIANT_BOOL Freeze, [out, retval] long* pRC);
HRESULT DirectIO(long Command, [in, out] long* pData, [in, out] BSTR* pString, [out, retval] long* pRC);
HRESULT ReleaseDevice([out, retval] long* pRC);
HRESULT GetPropertyNumber(long PropIndex, [out, retval] long* pNumber);
HRESULT GetPropertyString(long PropIndex, [out, retval] BSTR* pString);
HRESULT SetPropertyNumber(long PropIndex, long Number);
HRESULT SetPropertyString(long PropIndex, BSTR PropString);