06-27-2023 10:02 PM
はじめまして。
困っていることが有って、教えて頂てると助かります。宜しくお願いします。
現在、Keyence社のロガー、NR-X100から、Keyence社が提供しているドライバを使って計測・ロギングをしています。
EXEにビルドして動かすと、エラーコード7、ファイルが見るかりませんというエラーになってしまいます。Keyence社のサンプルVIのみのプロジェクトを作ってEXEにして実行しても、同じエラーが起きています。
同機種でのEXE化をおこなったことがあって解決方法をお聞き出来れば一番有難いですが、一般的に、instr.libに入れているドライバを使用しているもののEXE化で、行うべきこと・注意点などお聞かせいただけないでしょうか。
他社製品での場合どのようにしているか教えていただけると有難いです。
解決済! 解決策の投稿を見る。
06-28-2023 07:48 AM
NR-X100は使ったことがないので、一般的な話をします。
ファイルが見つからないエラーがライブラリ関数呼び出しで起こっているので、おそらくDLLが見つからないのでしょう。
開発環境でOKなのにEXEでダメなのは、パスの取得方法がうまくないか、その場所にDLLがないせいです。デバイスドライバのDLLならシステム領域にあって自動検索されるはずなので、VIのサポート用DLLでしょう。
サポート用DLLはEXEと同じ場所にコピーするのが簡単です(ちなみにビルド設定のデフォルトではdataフォルダがサポートディレクトリで、そこでもOKです)。
そもそもライブラリ関数呼び出しで呼んでいるDLLは、ビルド時にサポートディレクトリに自動的にコピーされるはずですが、ありませんか?
ないとすると、ライブラリ関数呼び出しで「ダイアグラムでパスを指定」して、自前でパスを取得して与えているのではないでしょうか。その場合、ビルド設定でDLLを「常に含む」ようにしてサポートディレクトリにコピーする必要があります。
そして、VIで取得したパスが正しくDLLを指しているかどうか確認してください(パスを一時的にどこかに表示するようにしたEXEを作るとか、デバッグを有効にしてEXEを作るなど)。
以下に改善のヒントを述べます。
以前からよく使われていたのは「現在のVIのパス」関数からディレクトリをたどる手法ですが、現在ではあまりお勧めできません。特にLabVIEW2009以降はEXE内にディレクトリツリーを作ってVIが配置されるので、たどる階層数を決め打ちしていると誤動作します。決め打ちしているVIがあるなら、ビルド設定の「上級」>>「LabVIEW8.xのレイアウトを使用」をONにしてビルドしてみてください。
今後は「アプリケーションディレクトリ」関数をお勧めします。プロジェクトのときはプロジェクトファイルの場所を、EXEにするとEXEの場所を返してきます。
06-28-2023 07:06 PM
J.H.Watson様
ご回答有難うございます。
dataフォルダの中には、DLLはすべて入っていました。(DLLs data folder.png)
「LabVIEW8.xのレイアウトを使用」のチェックを入れてビルドをして実行してみましたが、エラー7が発生する状態は変わりませんでした。
教えていただいたことによって気になりましたのは、サーポートからの話で、「Get Dll Path.vi」が返す「CommManager.dll」の位置のことです。
「Get Dll Path.vi」(Get DLL Path.png)は自己ファイルがフォルダの中にあるならば、そうでないならば(EXEなら)という条件で「CommManager.dll」のパスを返すようです。
dataフォルダのなかにあれば2つ上の階層にあるとする様ですが、アプリケーションフォルダ内のdataフォルダの中では、「Get Dll Path.vi」と「CommManager.dll」は同階層にあります。
この場合、そのパスには「CommManager.dll」は存在しない状態になります。
ほかにもそういう場所がある可能性があります。
Keyence社のドライバでは、別の階層構造になることを想定しているような気がします。
「LabVIEW8.xのレイアウトを使用」をチェックしてもdataフォルダの中はフラットでした。
06-28-2023 10:59 PM
DLLがdataフォルダにコピーされているのなら、そこを指すようにパスを取得する必要があります。Get DLL Path.viのコードだとダメですね。
パス取得の一例を下図に示します。条件無効ストラクチャを使ってエディット時(デフォルト)とEXE時(ランタイム)で分けてみました。
DLLのパスを取得しているコードが他にもあれば、すべて同じように書き換えてください。その上で「LabVIEW8.xのレイアウトを使用」をONにしてビルドしてお試しください。
なお「LabVIEW8.xのレイアウトを使用」はEXEファイルの内部構造に関するもので、dataフォルダには影響しません。
06-29-2023 02:44 AM
7つあるDLLそれぞれの為に、パスを得るためのVIが存在しました。
全てを教えていただいたブロックダイアグラムに準じて変更したところ、不具合検証用に作ったプロジェクトでエラーが無くなり、EXEで実行しても計測が正常に行えることを確認しました。
本当にありがとうございました。
実際にEXE化したかったプロジェクトは、稼働できるようになり次第、確認してみます。
オリジナルのVIのコメントでも、EXE化したときのことを考慮しているように思われます。
EXE化したときに、何らかの設定であのような位置関係になることがあり得るのか、気になるところです。
06-29-2023 05:39 AM
とりあえず動いてよかったです。
オリジナルのGet DLL Path.viを解読すると、
1) プロジェクトの際はGet DLL Path.viの場所から2階層上にあるDLL。
2) EXEの際は(LabVIEW8.xレイアウトで)EXEファイルの場所から2階層上にあるDLL。
(1)は計測器ライブラリのディレクトリ構造がそうなのでしょうが、(2)は不可解です。
インストーラのビルド設定で、インストール先ディレクトリを深掘りして、EXEの2階層上にDLLをコピーすれば動くかもしれませんが、だいぶ無理筋。
以下は私の想像ですが・・・
開発当初はGet DLL Path.viとDLLは同じ場所にあって、文字列はDLLのファイル名だけだったとすれば、EXEと同じ場所にDLLがあれば動きます。
ライブラリ化のとき誰かがDLLを2階層上に置いて動かなくなったので、文字列の先頭に「..\..\」を付けて間に合わせたが、そのときEXEのことをうっかり忘れていた。