-1

私はこれに髪を引っ張ってきました。私が書いたC++OPOSドライバーがあります。私はC#で仮想ピンパッドを作成しました。それは機能し、すべてが良好です。

しかし、私に与えられた1つの要求は、C#ドライバーが呼び出し元のプログラムに存在している必要があるということです。これは、OPOSドライバーが存在する場所である必要があると予想していたため、理解するのに時間がかかりました。設定がおかしいと思わせてしまいます。

私はそれが曖昧であり、より多くの情報が必要であることを知っていますが、どこから始めればよいのか、この点であなたがどのような情報を手伝う必要があるのか​​わかりません。私は頻繁にチェックインし、質問に答えます....私はこの漠然としたことを嫌います..炎上しないでください:)私は必要なだけ編集します。

編集

これをうまく表現できなくてすみません。これを書いているとき、私はたくさんのことをしていました。自分で読み直して「NEWB!」と思っていました。ハ。

さて、ダウンして汚れています。問題はCOMドライバーに関するものではなく、C#仮想ピンパッドに関するものです。要約すると、C#仮想ピンパッドdllは、登録済みのUPOSドライバーと同じ場所ではなく、実行可能ファイルと同じ場所にある必要があるのはなぜですか?

それでそれについて詳しく説明します。ドライバーは動作します(私がそれを再び台無しにしない限り)。指摘されたように、それを使用するプログラムには登録する必要があります。それはすべて順調です。このUPOSドライバーに関連するすべての必要なファイルを同じフォルダーに配置します。ある時点で、UPOSドライバーに組み込まれたC ++仮想ピンパッドがありましたが、簡単にするために、COMで表示されるC#仮想ピンパッドを作成する方が迅速かつ簡単であると判断しました。そして、ほとんどの場合、それはそうでした。グラフィカルな変更を加えれば、VPP.dllを置き換えることができ、生活は良かったので、それは良かったです。次に、このドライバーセットをコンピューターにインストールしましたが、VPPを開こうとすると、クラッシュしました。必死でVPPのコピーを始めました。dllを別の場所に移動し、実行中のプログラムと同じ場所に配置すると、動作を開始することがわかりました。これは私が望むものではありません。他のドライバーと同じディレクトリに配置できるようにしたいと思います。(これは環境によって異なりますが、一般的には「ProgramFiles」フォルダにあります)これで、上記の要約された質問に戻ります。私のUPOSドライバーがCOM呼び出しを行うドライバーであることに気が遠くなります。インストールを実行すると、インストールの一部としてVPP.dllがProgram Filesフォルダーに配置され、regasmが実行されます(これは成功したことを示しています)。ですから、実行中のプログラムに関係しているのではないかと頭を悩ませています。ああ、それが一元化された場所にある必要があるもう1つの理由は、いくつかの異なるプログラム(正確には4つ)が異なる場所にインストールされていることです。そして、ヒューマンエラーは、VPP.dllを各コンピューターの潜在的に4つの場所にコピーする必要はありません。(最終的には約500になります)

明確にしたので(そして実際に質問しました。それについては申し訳ありませんが)、何か提案はありますか?

4

2 に答える 2

1

これで、OPOS インターフェイスを実装する DLL (.net アセンブリ) ができました。OPOS インターフェイスは仕様上、COM オブジェクトです (OPOS は Ole for POS の略です)。

これがあなたの要件であると思います: ドライバーを使用するアプリケーションは、ネイティブかマネージかを問わず、CoCreateInstance を介してオブジェクトをインスタンス化できる必要があります。そのためには、デバイスを Windows レジストリに登録する必要があります。その方法については、次の例を参照してください。

注: UPOS (Universal POS) と呼ばれる新しい標準が開発されており、Microsoft の ".NET for POS" がそれをサポートしており、OPOS との下位互換性があることに注意してください。

編集(質問の編集に続く):
VPPはCOMオブジェクトのようで、現在のディレクトリではない任意のフォルダーからCoCreatableになるように登録するプログラムがあります。登録に何か問題があると思います。COM オブジェクトにプログラム ID と一意の CLSID があることを確認してください。HKCR\CLSID\<your object class id&>と の両方をレジストリでチェックアウトしますHKCR\<your object progid>。UPOS と申請書を 1 分間脇に置いておきます。単純な JavaScript ファイル (xxx.js) の行:var x = new ActiveXObject(<your prog id>)が、任意のフォルダーからスクリプトを実行するときに機能することを確認してください。

于 2012-10-31T21:49:55.753 に答える
1

この種の問題は、Windows (または CLR、それは明確ではありません) が依存する DLL を見つける方法の自然な結果です。COM サーバーの登録では、サーバーを実装する DLL へのパスのみが提供されます。それ以外の場合、依存 DLL の検索パスには影響しません。

これがネイティブ (非 .NET) DLL の場合、Windows は次を検索します。

  • EXE のロード元のディレクトリ
  • オプションで、SetDllDirectory() の呼び出しで指定されたディレクトリ
  • Windows システム ディレクトリ。デフォルトは c:\windows\system32 です。
  • 16 ビットの従来のシステム ディレクトリ。デフォルトは c:\windows\system です。
  • Windows ディレクトリ。デフォルトは c:\windows です。
  • プロセスのデフォルトの作業ディレクトリ
  • PATH 環境変数にリストされているディレクトリー

これが .NET DLL の場合、CLR は以下を検索します。

  • GAC
  • EXE のロード元のディレクトリ
  • <probing>必要に応じて、app.exe.config ファイル内の要素によって指定されたプローブ パス。

したがって、依存する DLL が EXE ディレクトリに配置されていれば、明らかに問題はありません。そして、あなたがそれをどこか別の場所にしたいのであれば、かなり厄介なものです。上記のリストから 1 つを選択します。

于 2012-11-02T14:29:27.167 に答える