hinekure.net が http://hspdev-wiki.net/ から自動クローリングした結果を表示しています。画像やリソースなどのリンクが切れています。予めご了承ください。
Module/拡張版dirinfo - HSP開発wiki
トップ    編集凍結 差分バックアップ添付複製名前変更リロード   新規一覧単語検索最終更新   最終更新のRSS

Module


拡張dirinfoモジュール [hsp3]

dirinfo関数にVista以降のUACの回避案を盛り込んでみました。
UACに抵触しなさそうならアプリデータパスを得て、iniファイル等はそこで扱おうというものです。

具体的には実行ファイルのパスが「C:\WINDOWS」や「C:\Program Files」などの下層フォルダならば、「C:\Documents and Settings\[アカウント名]\Application Data」や「C:\Users\[アカウント名]\AppData?\Roaming」を返します。
またこの場合はstatに1以上を返します。
UACと無縁そうなら実行ファイルのパスをそのまま返します。

ついでに一時フォルダ(TEMP)のパスと自身の実行ファイル名も取得できます。

モジュール

Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
-
|
!
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
;==========================================================
; dir_app  :アプリデータフォルダ(Application Data)を返します
; dir_ini  :UACに触れなさそうなら実行ファイルのフォルダを返します
;           触れそうならアプリデータフォルダを返しstatに1以上を格納
; dir_temp :一時フォルダのパスを返します
; dir_self :自身の実行ファイル名を返します
;==========================================================
 
#ifndef __MODULE_DIRINFOUAC__
#define __MODULE_DIRINFOUAC__
 
#undef dirinfo
 
#module _mod_dirinfouac_
  #uselib "kernel32.dll"
  #func _get_temp_path_ "GetTempPathA" int, var
  #func _get_module_file_name_ "GetModuleFileNameA" int, var, int
 
#defcfunc _dirinfo int p1
  sdim rPath, $100 : sdim tmp, $100 : i = 0
  switch p1
    case $FFFD  ;自身の実行ファイル名
      _get_module_file_name_ 0, rPath, $100 : swbreak
    case $FFFE  ;一時フォルダ
      _get_temp_path_ $100, tmp
      rPath = strmid(tmp, 0, strlen(tmp)-1) : swbreak
    case $FFFF  ;UAC回避用作業フォルダ?
      rPath = getpath(dirinfo@hsp(1), 16)
      repeat 4, $10023
        ;抵触しそうなパスと先頭文字列で被ってるか検査
        tmp = getpath(dirinfo@hsp(cnt), 16)
        if tmp!"" {
          if instr(rPath, 0, tmp)=0 {i++}
        }
      loop
      if i!0 {rPath = dirinfo@hsp($1001A)} : swbreak
    default     ;その他の通常取得
      rPath = dirinfo@hsp(p1)
  swend
  mref tmp,64 : tmp = i
  return rPath
 
#define global ctype dirinfo(%1=0) _dirinfo(%1)
#define global dir_ini _dirinfo($FFFF)
#define global dir_temp _dirinfo($FFFE)
#define global dir_self _dirinfo($FFFD)
#define global dir_app _dirinfo($1001A)
 
#global
#endif

検証用サンプル

Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
;#include "↑のモジュール"
 
goto *Main
 
*Test_Save ;ファイル保存テスト
  p = dir_ini : s = strmid(p, -1, 1)
  if (s!="\\")&(s!="/") {p += "\\" }
  s = "ファイル保存テスト"
  bsave p+"ファイル保存テスト.ini", s, strlen(s)
  mes "\n「"+p+"」に\n「ファイル保存テスト.ini」を書き出してみました。"
  return
 
*Main
  pos 6, 4
  mes "実行ファイル名 :"+dir_self
  mes "一時フォルダパス:"+dir_temp
  mes "実行ファイルパス:"+dir_exe
  mes "アプリデータパス:"+dir_app
 
  color 255
  mes "\n作業フォルダパス:"+dir_ini
  color ,128
;  gosub *Test_Save ;ファイル保存テスト
 
  stop
 

コメント

  • 書いてはみましたが当方Vista環境では無い為全くの未検証です [sad2]
    どなたか検証お願いします。 -- 2012-08-15 (水) 23:53:20

URL B I U SIZE Black Maroon Green Olive Navy Purple Teal Gray Silver Red Lime Yellow Blue Fuchsia Aqua White

トップ    編集凍結 差分バックアップ添付複製名前変更リロード   新規一覧単語検索最終更新   最終更新のRSS
Last-modified: 2012-08-15 (水) 23:53:21 (479d)