NI製品ディスカッション

キャンセル
次の結果を表示 
次の代わりに検索 
もしかして: 

User32.dll呼出しを含むviのエラー

解決済み
解決策を見る

LabVIEW2010で、ライブラリー呼び出しノードを使ってUser32.dllの関数を呼んでいます。

 

vi単体では問題無く動くのですが、アプリケーション(exe)をbuildすると、

exeは起動して実行出来ますが、画面右上の×マークで閉じると、

添付のError.jpgのようなシステムエラーが発生します。

 

同様の現象、解決方法など、何か御存知の方が居られましたら、

情報を頂けませんでしょうか? 宜しくお願い致します。

 

サンプルで作ったviも添付します。

(カーソルを指定座標に移動させるだけのものです)

 

 

すべてをダウンロード
0 件の賞賛
メッセージ1/4
6,148件の閲覧回数
解決策
受理者 jaim

jaim様、

 

平素よりNI製品をご利用頂きまして誠に有難うございます。

日本ナショナルインスツルメンツ技術部 中山と申します。

 

ビルドする際に、User32.dllも含まれ、コピーされてしまうと思います。

この場合、System32の下のUser32.dllとあわせて2つUser32.dllが存在してしまうことになります。

通常のdllなら問題ないのですが、

System32の下のUser32.dllはユーザーインタフェースの入力を監視するため、常に実行されていますので、

このexeを実行した場合は、User32.dllが2つとも実行され、競合が起こってしまいます。

 

対策として、User32.dllのコピーを作成せず、パスで呼び出すことができます。

以下の方法をお試し下さい。

 

ライブラリ呼び出しの設定で「ダイアグラムでパスを指定」にチェックを入れ、

パス定数を入力します。

ライブラリパス.png

お手数ですが、宜しくお願いいたします。 

 

中山慧美

Emi Nakayama

Application Engineer

NI Japan

 

Emi Nakayama
Applications Engineer, Japan
National Instruments
メッセージ2/4
6,123件の閲覧回数

日本ナショナルインスツルメンツ 技術部

中山様

 

お世話になっております、jaimです。

 

上記の通り変更したところ、うまく動くようになりました。

(言われてみると確かにその通りで、おかしくなって当たり前ですね....)

 

アドバイス頂き有難うございました、

また今後とも宜しくお願い致します。

0 件の賞賛
メッセージ3/4
6,088件の閲覧回数

全く同じ問題で技術サポートの方に問い合わせてしまったのですが

別の回答頂いたので追記しておきます。

 

このスレッドの解決策の通りライブラリパスを指定する端子を使う方法でも殆どの場合問題無いと思いますが、

OSが標準パス以外でインストールされているケースでは指定したパスが合わなくなると思います。

 

下記の資料にある通り、ライブラリ関数呼び出しノードの参照指定にはライブラリ名だけでの指定とパス指定が使えます。

Specifying the Location of Shared Libraries on Disk

 

ライブラリ名で指定するとシステムフォルダのDLLを呼び出し、EXEのビルド時もDLLがコピーされません。

パスで指定するとEXEビルド時に自動的にサポートフォルダへDLLのコピーが作成され、そのDLLを呼び出そうとします。

 

0 件の賞賛
メッセージ4/4
5,384件の閲覧回数