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


HSPTV!掲示板


未解決 解決 停止 削除要請

2006
1112
うひょ実行ファイルのフルパスを取得9解決


うひょ

リンク

2006/11/12(Sun) 15:33:39|NO.3422

実行ファイルのフルパスを取得しようと思い検索してみると、
GetModuleFileName API関数が見つかったのですが、具体的な使い方が
書いてなく、どう使えばいいのか分かりません。
どう使えばいいのでしょうか。



この記事に返信する


七次元

リンク

2006/11/12(Sun) 15:40:23|NO.3423

dirinfo命令じゃ駄目ですか?
APIを使いたいのならすみません



うひょ

リンク

2006/11/12(Sun) 17:10:10|NO.3427

dirinfo関数では、実行ファイルのディレクトリが得られますが、
実行ファイルのファイル名が分からないので勝手に変更された時に
困ります。
それとは別に自分自身のファイル名を得られればいいのですが…。



osakana

リンク

2006/11/12(Sun) 18:51:04|NO.3429

こうやって使います。(と思います


#uselib "KERNEL32.DLL" #cfunc GetModuleFileName "GetModuleFileNameA" int, var, int #define size 256 sdim buf,size len=GetModuleFileName(0,buf,size) if len = 0 :dialog "エラー" :end mes strf("%d byte",len) mes buf



うひょ

リンク

2006/11/12(Sun) 18:54:51|NO.3430

ありがとうございます!
別のサンプルで構造体らしき複雑なことをやっていたので
質問したのですが、簡単なものだったのですね。
ありがとうございました。



GENKI

リンク

2006/11/12(Sun) 19:15:36|NO.3432

HSP2掲示板の過去ログ103の
http://www.onionsoft.net/hsp/bbs/log/103.html
708〜721
に関連記事があります。
って私が回答してたのか。w


> 実行ファイルのフルパスを取得しようと思い検索してみると、
さくらさんのサイトで公開されているモジュール集のなかにちょうどいい命令がありますよ。
HSP-NEXT
http://www.silkroad.ne.jp/sakura/



> GetModuleFileName API関数が見つかったのですが、具体的な使い方が
> 書いてなく、どう使えばいいのか分かりません。

MSDNで引数の内容調べてあとはごにょごにょと…その辺は私もよく分かってません。(-_-;;
ということでHSP2のサンプルとモジュール集を参考にAPIの練習のため抜き出してみました。

#uselib "KERNEL32.DLL" #func GetModuleFileName "GetModuleFileNameA" int,sptr,int sdim String, 256 GetModuleFileName hModule,varptr(String), 256 mes ""+String
hModuleが「モジュールハンドル」らしいんですが…意味がわかりません。orz



七次元

リンク

2006/11/13(Mon) 00:11:03|NO.3439

exe名も取得したかったのですか。
自分も参考になりました(笑



Irisawa

リンク

2006/11/13(Mon) 04:54:55|NO.3442

> hModuleが「モジュールハンドル」らしいんですが…意味がわかりません。orz

モジュールハンドルというのはモジュールのハンドル(操作するための一意的なID)のこと
です。
この場合のモジュールとは実行モジュール(実行ファイル)のことです。

hModuleをNULL(0)にした場合は、実行中の自分(つまりGetModuleFileNameを呼び出した
実行モジュール)を指します。
それ以外ではLoadLibraryやGetModuleHandleなどを使用して任意のモジュールハンドルを
取得する方法があります。

以下は蛇足。
Windowsは内部的に各モジュールハンドルのモジュール呼び出し回数をカウントしており、
LoadLibraryはメモリ上に指定したモジュールが既にあった場合はそのモジュールの
モジュールハンドルを取得し、なければモジュールをメモリに読み込んでから取得します。
LoadLibraryを使用した場合はFreeLibraryで開放しなければいけません。
(LoadLibraryでカウントを+1し、FreeLibraryで-1して、カウントが0になるとメモリから
モジュールが開放されます)
GetModuleHandleはメモリ上のモジュールハンドルを取得し(メモリ上にモジュールがない
場合は失敗する)、カウントを変更しません。
その為、FreeLibraryも不要(必要でない限り、問題が起こるので呼び出してはならない)
です。

http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpdllpro/html/_win32_loadlibrary.asp
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpdllpro/html/_win32_getmodulehandle.asp



Irisawa

リンク

2006/11/13(Mon) 05:05:47|NO.3443


#func GetModuleFileName "GetModuleFileNameA" int,sptr,int

一応、sptrは定数(内部的にはLPCSTRかな)を指すはずなので、変数が必要な引数には指定
しない方がいいでしょう。
この場合は、osakanaさんのようにvar(内部的にはLPVOIDだと思う)を使った方がいいです。

って、ここまで書いて定数(LPCSTR)なのはstrの方なのかなとか。



GENKI

リンク

2006/11/13(Mon) 20:20:09|NO.3460

>>Irisawaさん
私の便乗質問に解説ありがとうございます!
そうですか、「実行ファイルのID」見たいなかんじの意味ですか。
…しかし完全理解にはもう少しかかりそうです。(^ ^;
じっくりやってみます。



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