0

私が書いている MSR OPOS サービス オブジェクトの例は、正しく初期化されていませんでした。さまざまな検索がまったく役に立たなかったので、同じ問題に遭遇した他の人を助けるためにこの質問を追加しています。

私の質問は次のとおりです。OPOS サービス オブジェクトで不足しているメソッドを特定するにはどうすればよいですか? OPOS サービス オブジェクトを実行して、不足しているものを教えてくれるユーティリティはありますか? インターフェイスが提供することが期待されているメソッドと、欠落しているメソッドを特定する方法はありますか?

OPOS サービス オブジェクトの作成方法を学ぶために、ATL を使用した OPOS サービス オブジェクトの記述の手順に従っています。Windows XP で Visual Studio 2005 を使用しています。基本機能をテストするには、NCR Retail Services Manager (RSM) ユーティリティを使用して MSR のプロファイルを作成し、Mag Stripe Reader シミュレータ サービス オブジェクトの基本機能をテストします。

Visual Studio プロジェクトは COM オブジェクトを作成し、正しく登録します。サービス オブジェクト プロファイルで RSM の診断機能を使用しようとすると、エラーが発生しますOPOS_E_NOSERVICEDLLMain()サービス オブジェクトが読み込まれ、 COM オブジェクトの関数が呼び出され、呼び出されたことを示すログ ファイル ログ関数を COM オブジェクトに作成しましたDLLGetClassObject()。ただし、さまざまなサービス オブジェクト インターフェイス メソッドを記録する 2 番目のログ ファイルは作成されず、サービス オブジェクト インターフェイス メソッドが呼び出されていないことが示されます。

そのため、COM オブジェクトのロード時に行われるチェックに失敗するサービス オブジェクト インターフェイスに問題があるようです。

関数は Visual Studio ATL プロジェクト ウィザードによって生成されるため、DllGetClassObject()変更する必要はありません。

POS .NET 1.12 に付属の Microsoft POS .NET サンプル ユーティリティを使用して、サンプル ユーティリティを使用してみました。MSR ノードの下のツリー コントロールで、NCR RSM で作成されたプロファイルを確認できます。ただし、試行するOpenとエラーメッセージが表示されます。Windows イベント ログに次のエラーが表示されます。

Microsoft.PointOfService.PosControlException: メソッド Open が例外をスローしました。サービス オブジェクトは、そのリリースで必要な 1 つ以上のメソッドをサポートしていません。

4

1 に答える 1

0

コードの検査とレビューから、不足しているメソッドをようやく見つけました。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);
于 2015-07-14T15:32:53.907 に答える