VB6で下記の処理を作り、XPで問題なく使っておりましたが、Vistaで動かしたところUAC対策により、c:\ProgramFiles\(app.path)の下に置いたlist.csvに書き込みができなくなりました。
同じパスにあるmdb(Access2000)から特定のテーブルデータをCSV出力する処理ですが、UACを調べると上記のパスへの書き込みはできないとのこと。
対応策としては、UAC機能の無効化、管理者権限で起動などがあるようですが、いずれでもない方法で、CSV出力はできないものでしょうか?
vb6の「ディストリビョーションウイザード」では、どうしてもUAC対策の影響があるパスにしかセットアップ先を選べないので困っています。
よろしくお願いします。
-------------------------------------
Dim fn, p, k
fn = FreeFile
Open App.Path & "\list.csv" For Output As fn
sql = "select [id],[name],[kana],[email] from list order by [kana]"
ReDim field(4, 1000)
selectDB sql, field(), 4, p
For k = 1 To p
Write #fn, field(0, k), field(1, k), field(2, k), field(3, k)
Next
Close fn
r = Shell("notepad.exe " & App.Path & "\list.csv", vbNormalFocus)
End Sub
UACを無効化しないで、かつ管理者権限の無いアプリでProgramFiles下のフォルダにアクセスしたい・・・と。
セキュリティって何だろうね。
どっちも嫌なら「ディストリビョーションウイザード」を使わないで他のフォルダにインストール出来るインストーラを自前で用意するしか無いんじゃない?
lol様
早速のご回答有難うございます。
>他のフォルダにインストール出来るインストーラを自前で用意する
私は超初心者のため自分でインストーラを作るまでの技術がないため、他のインストーラ(まずはVisual Studio 6.0 Installer)を使いチャレンジしておりますが、こちらも特定のフォルダの下にしか置けないようで行き詰まりました。
過去ログでバッチファイルでフォルダを作成する方法を見つけましたが、できたらこれは最終手段にしたいと考えています。
http://madia.world.coocan.jp/vb/vb_bbs2/200403/200403_04030028.html
App.Pathにあるmdb(Access2000)から特定のテーブルデータをCSV出力する処理の書き方について調べていますが、どれも出力先のファイルをあらかじめ置いておく処理になっています。
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1411612004
あらかじめlist.csvを置いておくことはせずに、いきなりメモ帳に出力することはできないでしょうか?(保存はそのあとで・・)
もしお分かりでしたらご教示ください。
> vb6の「ディストリビョーションウイザード」では、
> どうしてもUAC対策の影響があるパスにしかセットアップ先を選べないので困っています。
「$(AppPath)」を指定して、インストール先を、
インストール時に変更する(or デフォルトのインストール先を手動で変更しておく)じゃ駄目なんでしょうか?
例えば・・・
メモ帳とかで、作成した「SETUP.LST」の「DefaultDir」を
「C:\Project名」とかの固定パスに書き換えてしまうとか・・・
大吉末吉様
ご教示有難うございました。
>メモ帳とかで、作成した「SETUP.LST」の「DefaultDir」を
>「C:\Project名」とかの固定パスに書き換えてしまうとか
この方法でうまくいきました。このことで5日ほど悩み試行錯誤を繰り返しておりましたので、見通しが立ち感謝感謝です。
そこでもうひとつ質問なのですが、「SETUP.LST」で固定パスに変えても、
「ディストリビョーションウイザード」で指定した(どこかに指定せざるを得ない)インストール先である$App.pathにも置かれてしまうのですが、ここに置かない方法があればお教え願えないでしょうか?
初歩的な質問かと思いますがよろしくお願いします。
何でインストーラの話になるのかよくわかりませんが、
「プログラムをどこにインストールするのか」はユーザの自由なのであって、
インストール先がどこであろうと、ちゃんと動作するようなプログラム
を組むのが質問者殿のお仕事でしょう。
でもって、
プログラムの置き場 ≠ そのプログラムが好き勝手にいじってよい場
ですよ。
というのがVistaの思想なのですから、
それに則ってプログラムを改修するのが本筋かと。
> Open App.Path & "\list.csv" For Output As fn
どうしてApp.Pathの下にファイルを作る必要があるのでしょうか?
> r = Shell("notepad.exe " & App.Path & "\list.csv", vbNormalFocus)
単にNotePadで開くためであれば、テンポラリフォルダを使うとか。
たとえば、 Environ("TEMP") で求められますが。
> ここに置かない方法があればお教え願えないでしょうか?
とは、
> あらかじめlist.csvを置いておくことはせずに、
> いきなりメモ帳に出力することはできないでしょうか?(保存はそのあとで・・)
のことでしょうか?
メモ帳にはそういう機能は無いですからね・・・
ファイルを残したくないなら、もげさんの方法が良いと思います。
又は、プログラムの終了時に、「App.Path & "\list.csv"」を削除するようにするとか・・・
(おまけ)
以下は、かなりトリッキーな方法です。
--------------------------------------------------------
Dim s As String
Dim r As Long
s = "a,2,3,4" & vbCr & _
"aaaaaaaaaaaaaaa,bbbbbbbbbbbbbbbb,ccccccccccccccc,ddddddd"
r = Shell("notepad.exe", vbNormalFocus)
AppActivate r, True
SendKeys s
--------------------------------------------------------
#確実性の薄い方法(文字列が長いと上手く動かない可能性が・・・)
#ですので、お勧めできませんけど・・・
もげ様 大吉末吉様
ご丁寧なご教示有難うございました。
まず、私の発言について訂正をさせていただきます。
>「SETUP.LST」で固定パスに変えても、「ディストリビョーションウイ
>ザード」で指定した(どこかに指定せざるを得ない)インストール先で
>ある$App.pathにも置かれてしまう
・・・と報告しておりましたが、再度試みましたところ、$App.pathには置かれておりませんでした。訂正しお詫びいたします。この時点で質問していました問題点は解決できました。
最終的にはもげ様の「テンポラリフォルダ」を利用するか、大吉末吉様の「プログラム終了時に削除」で行いたいと思います。
この度は大変勉強になりました。有難うございました。
ツイート | ![]() |