Visual Basic6.0で作成したEXEファイルに、
ファイルをドラッグアンドドロップしてファイルを受け取るような
アプリを作成したのですが、
「鍚」という文字がファイル名にある場合、空白になってしまい
うまく取得できないようです。
過去ログ等、読んでみましたが解決方法がイマイチわかりませんでした。
Unicode文字だからVB6では無理なのでしょうか?
初歩的なことかもしれませんが、宜しくお願いします。。
> 「鍚」という文字がファイル名にある場合、
「金昜」かな?
> うまく取得できないようです。
Command 関数だと無理っぽいですね。
GetCommandLineW API もしくは CommandLineToArgvW API を使ってみてください。
これでどうかな?
'=====
Option Explicit
Private Declare Function GetCommandLineW Lib "Kernel32" () As Long
Private Declare Sub lstrcpyW Lib "Kernel32" (ByRef dest As Any, ByVal src As Any)
Private Declare Function lstrlenW Lib "Kernel32" (ByVal lpString As Long) As Long
Private Sub Form_Load()
Dim S As String
S = GetCommandLine()
CreateObject("WScript.Shell").Popup "[" & S & "]"
End Sub
Public Function GetCommandLine() As String
GetCommandLine = Command()
Dim p As Long
p = GetCommandLineW()
If p = 0 Then
Exit Function
End If
Dim lngLen As Long
lngLen = lstrlenW(p)
If lngLen = 0 Then
Exit Function
End If
Dim result() As Byte
ReDim result(0 To lngLen * 2 - 1)
lstrcpyW result(0), p
GetCommandLine = CStr(result)
End Function
魔界の仮面弁士さんありがとうございます!!
早速試してみましたが、「?」で表示されます。
プログラムに追加させていただいたのは、
Private Declare Function GetCommandLineW Lib "Kernel32" () As Long
Private Declare Sub lstrcpyW Lib "Kernel32" (ByRef dest As Any, ByVal src As Any)
Private Declare Function lstrlenW Lib "Kernel32" (ByVal lpString As Long) As Long
と
Public Function GetCommandLine() As String ・・・
のところです。
今まで、Command()としてたところをGetCommandLine()に変えました。
取得した文字列をMsgBoxで出力してみると
MsgBox "GetCommandLine()" & GetCommandLine()
↓
GetCommandLine()"C:/work/aaa.exe" C:/work/?.txt
?には魔界の仮面弁士さんがおっしゃるとおり、「金昜」がファイル名に入ってます。
Kernel32をインストール?しないと駄目なんですか?
基本過ぎてすいません・・
私のサンプルを、もう一度良く見てください。
文字列の確認に、WshShell オブジェクトの Popup メソッドを使っていますよね。
VB6 の Debug.Print や MsgBox は、Unicode に対応していません。
受け取った文字列の内容を確認するには、以下のようにします。
(案1) VBScript の MsgBox を(ScriptControl 経由で)呼び出す。
(案2) WshShell.Popup メソッドを使う。
(案3) Unicode 対応コントロールを使う(DataGrid, WebBrowser, MSForms など)
(案4) TextOutW API や MessageBoxW API を使う。
(案5) FileSystemObject を使い、Unicode のテキストファイルにする。
横から失礼。
> 早速試してみましたが、「?」で表示されます。
> MsgBox "GetCommandLine()" & GetCommandLine()
MsgBoxを使っては駄目なのでは?
VB6には、「Shift-JISにしかない文字を表示する機能」はないので、
MsgBoxだと、結局文字化けします。
魔界の仮面弁士さんのサンプルの様に
> CreateObject("WScript.Shell").Popup "[" & S & "]"
UNCODE表示に対応した方法を使わないと・・・
#多分、この後行うつもりの「ファイル名を使ったファイルの操作」も
#VB6の組み込み機能だと動作しないのでは・・・
> VB6には、「Shift-JISにしかない文字を表示する機能」はないので、
# 何か違うような…。
> > VB6には、「Shift-JISにしかない文字を表示する機能」はないので、
> # 何か違うような…。
いい表現が思いつかなかったので・・・
>>バーバパパさん
という事で、MsgBox 部を以下のように変更してみてください。
'実際には、先述の関数から得たコマンドラインが入ります。
Dim S As String
S = "C:\work\" & ChrW(37722) & ".txt"
'これは化けてしまいます。
MsgBox S
'案1: VBScript の MsgBox を使えば化けません
Dim ret As VbMsgBoxResult
With CreateObject("ScriptControl")
.Language = "VBScript"
ret = .Eval("MsgBox(""" & S & """)")
End With
'案2: WshShell の Popup を使うこともできます(再掲ですが)
ret = CreateObject("WScript.Shell").Popup(S)
>> 大吉末吉さん
正確な表現かどうかというより、そもそも逆の意味になっている気がしたのですよ。
> 「Shift-JISにしかない文字を表示する機能」はない
ではなく、
「Unicode にしかない文字を表示する機能」はない
とか、あるいは
「Shift_JIS に無い文字を表示する機能」はない
といった表現になるのかな、と。
>#多分、この後行うつもりの「ファイル名を使ったファイルの操作」も
>#VB6の組み込み機能だと動作しないのでは・・・
今回のファイル名だと、Open ステートメントによる入出力は出来ませんね。
ファイル操作が必要なら、ADODB.Stream オブジェクトを利用するか、
FileSystemObject の OpenTextFile メソッド等を使う必要があるでしょう。
> 魔界の仮面弁士さん
おっしゃるとおりです。
いろいろ捻くっている内に書き間違えた様です・・・(恥)
> バーバパパさん
紛らわしい発言になって、申し訳ありません。
>魔界の仮面弁士さん
素早い回答、本当に助かります。
すいません、MsgBoxでも使えるものだと思ってました。。
魔界の仮面弁士さんが書かれてたように、Popup メソッドを使ったら
無事文字を取得できました。
丁寧なご指導ありがとうございます。
>大吉末吉さん
ご指導ありがとうございます。
>#多分、この後行うつもりの「ファイル名を使ったファイルの操作」も
>#VB6の組み込み機能だと動作しないのでは・・・
そんな気がしてきました・・・・・・
現在、ユーザーと特殊文字をそもそも使用可にするかどうかで
相談になりました。
魔界の仮面弁士さんに提案していただいた
FileSystemObject の OpenTextFile メソッドを使って
色々試してみます。
またお世話になるかもしれません。。