HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2015
0327
> <外部DLLの呼び出しに失敗13解決


> <

リンク

2015/3/27(Fri) 00:23:59|NO.68140

エディタ上でのことです。
以下の様なプログラムを書き、問題なく動作しました。


#uselib "user32.dll" #cfunc FindWindowA "FindWindowA" sptr, sptr #func SetWindowPos "SetWindowPos" int,int,int,int,int,int,int #define HWND_TOPMOST $FFFFFFFF #define SWP_NOMOVE $00000002 #define SWP_NOSIZE $00000001 #define SWP_SHOWWINDOW $00000040 #define HWND_NOTOPMOST $FFFFFFFE shWnd = FindWindowA(0, "テスト用html - Windows Internet Explorer") mes shWnd SetWindowPos shWnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW stop

しかし、これを他のプログラム(500行以上)に組み込んだところ、
表題のようにエラーとなります。
コピペしたのに、なぜ呼び出せなくなるのかわかりません。
ご指導ください。



この記事に返信する


nepisat

リンク

2015/3/27(Fri) 11:16:36|NO.68146

エラー内容がないのでわかりませんが、
・user32を多重宣言している
・同じdefineを複数している
を確認してみてください。



> <

リンク

2015/3/27(Fri) 12:34:20|NO.68147

検索してみましたが、多重ミスはしていませんでした。
「エラー内容」とはどのことを書いたらよいでしょうか。



ファルコン

リンク

2015/3/27(Fri) 12:38:45|NO.68148

>「エラー内容」とはどのことを書いたらよいでしょうか。
『結果レポート』ダイアログに表示されている内容です。



> <

リンク

2015/3/27(Fri) 13:01:38|NO.68149

結果レポートは表示されません。
単に警告ダイアログが開いて、
「エラー38 外部DLLの呼び出しに・・・」と表示されて止まります。



ファルコン

リンク

2015/3/27(Fri) 13:20:05|NO.68150

>他のプログラム(500行以上)
そのプログラムのソースを記載してください。



nepisat

リンク

2015/3/27(Fri) 18:51:06|NO.68155

念のためuser32.dllをメインフォルダに入れてみてください。



cats

リンク

2015/3/27(Fri) 19:05:17|NO.68156

せめてこのコードの中のどの関数が失敗しているかを教えて下さい。
組み込んだときの変数の状況や関数の成功状態などをlogmes等でデバッガでしっかり確認しながらトレースしてください。
そうすれば何が原因でエラーになっているかが分かります。



> <

リンク

2015/3/27(Fri) 22:01:01|NO.68165

帰宅が遅くなりましてすいません。

昼間思いついたことがあって、さきほどそれを試したところ当たりでした。

組み込み先のプログラムにはもともとuser32.dllは使っていませんでした。
組み込む際に

#uselib "user32.dll" #include "llmod3/llmod3.hsp" #include "llmod3/input.hsp" #include "hspext.as" #include "hspda.as"
としたところ、追加したFindWindowとSetWindowPosがどちらも
「呼び出せません」となりました。
そして、hspextとhspdaのあとにuser32を宣言すると、
エラーは出ず、意図した動作となりました。

競合というやつでしょうか。hspextやhspdaからFindWindowAを
呼び出せないのでエラーになっていた?
これからは#uselib "user32.dll"を最後にします。

お騒がせしました。



掘木

リンク

2015/3/27(Fri) 23:43:00|NO.68173

>競合というやつでしょうか。hspextやhspdaからFindWindowAを
>呼び出せないのでエラーになっていた?
そりゃFindWindowAはuser32の関数であってhspextやhspdaの関数じゃないから、
呼び出せるはずがないのです。

#uselibは、これ以降の外部参照関数、命令が
どのファイルに属しているかを記載する先行宣言です。
そしてこの宣言は、記述されるたびに上書きされます。
なので、cfunc等の外部参照関数の宣言を使用ライブラリの宣言を離して書くと結構事故ります

#uselibの次行に#cfuncや#funcを連ねて書く方が安全です。
#includeを挟むのは危険すぎです。

…というか#cfuncや#funcは#uselibとセットで一緒に書くと思っとけば間違いがない。
同じdllを連続で#uselibしても問題ないし。



> <

リンク

2015/3/28(Sat) 00:32:45|NO.68174

なるほど、そういうものなんですね
試しに

#uselib "user32.dll" #cfunc FindWindowA "FindWindowA" sptr, sptr #func SetWindowPos "SetWindowPos" int,int,int,int,int,int,int #include "llmod3/llmod3.hsp" #include "llmod3/input.hsp" #include "hspext.as" #include "hspda.as"
としたところ普通に動きました。
勉強になりました。



skyblue

リンク

2015/3/28(Sat) 12:00:59|NO.68183

>念のためuser32.dllをメインフォルダに入れてみてください。
ライセンス違反になって最悪警察が来ますのでやめましょう。



ファルコン

リンク

2015/3/28(Sat) 13:39:38|NO.68185

下記のサイトに


これらのライブラリはWindowsのシステムにあらかじめ用意されてるもの(Windows OSの根幹に関わる重要なファイル)で、 すべてのWindowsマシンに含まれてます。Microsoftの著作物なので、HSP拡張プラグインのように実行ファイルといっしょに同封して配布したりするものではないのでご注意を。
と記載されています。
http://www.geocities.co.jp/Playtown-Yoyo/6130/hsp/hsp-win32api.html

なので「user32.dll」は全てのWindowsに入っています、同梱させる必要はありません。



prince

リンク

2015/3/28(Sat) 14:44:07|NO.68186

llmodは外部DLLの関数をGlobal宣言しているようで、よく競合を起こします。
今回はそれが原因ではなかったようですが、気をつけたほうがよさそうです。



ONION software Copyright 1997-2023(c) All rights reserved.