12-27-2011 06:33 AM
LabVIEW2010で、ライブラリー呼び出しノードを使ってUser32.dllの関数を呼んでいます。
vi単体では問題無く動くのですが、アプリケーション(exe)をbuildすると、
exeは起動して実行出来ますが、画面右上の×マークで閉じると、
添付のError.jpgのようなシステムエラーが発生します。
同様の現象、解決方法など、何か御存知の方が居られましたら、
情報を頂けませんでしょうか? 宜しくお願い致します。
サンプルで作ったviも添付します。
(カーソルを指定座標に移動させるだけのものです)
解決済! 解決策の投稿を見る。
12-27-2011 11:26 PM
jaim様、
平素よりNI製品をご利用頂きまして誠に有難うございます。
日本ナショナルインスツルメンツ技術部 中山と申します。
ビルドする際に、User32.dllも含まれ、コピーされてしまうと思います。
この場合、System32の下のUser32.dllとあわせて2つUser32.dllが存在してしまうことになります。
通常のdllなら問題ないのですが、
System32の下のUser32.dllはユーザーインタフェースの入力を監視するため、常に実行されていますので、
このexeを実行した場合は、User32.dllが2つとも実行され、競合が起こってしまいます。
対策として、User32.dllのコピーを作成せず、パスで呼び出すことができます。
以下の方法をお試し下さい。
ライブラリ呼び出しの設定で「ダイアグラムでパスを指定」にチェックを入れ、
パス定数を入力します。
お手数ですが、宜しくお願いいたします。
中山慧美
Emi Nakayama
Application Engineer
NI Japan
01-05-2012 02:53 AM
日本ナショナルインスツルメンツ 技術部
中山様
お世話になっております、jaimです。
上記の通り変更したところ、うまく動くようになりました。
(言われてみると確かにその通りで、おかしくなって当たり前ですね....)
アドバイス頂き有難うございました、
また今後とも宜しくお願い致します。
12-20-2013
02:18 AM
- 最終編集日:
05-28-2025
04:16 PM
、編集者:
Content Cleaner
全く同じ問題で技術サポートの方に問い合わせてしまったのですが
別の回答頂いたので追記しておきます。
このスレッドの解決策の通りライブラリパスを指定する端子を使う方法でも殆どの場合問題無いと思いますが、
OSが標準パス以外でインストールされているケースでは指定したパスが合わなくなると思います。
下記の資料にある通り、ライブラリ関数呼び出しノードの参照指定にはライブラリ名だけでの指定とパス指定が使えます。
Specifying the Location of Shared Libraries on Disk
ライブラリ名で指定するとシステムフォルダのDLLを呼び出し、EXEのビルド時もDLLがコピーされません。
パスで指定するとEXEビルド時に自動的にサポートフォルダへDLLのコピーが作成され、そのDLLを呼び出そうとします。