VB6アプリでファイルの文字列が取得できません。


バーバパパ  2007-11-13 01:22:43  No: 138102

Visual Basic6.0で作成したEXEファイルに、
ファイルをドラッグアンドドロップしてファイルを受け取るような
アプリを作成したのですが、
「鍚」という文字がファイル名にある場合、空白になってしまい
うまく取得できないようです。
過去ログ等、読んでみましたが解決方法がイマイチわかりませんでした。
Unicode文字だからVB6では無理なのでしょうか?

初歩的なことかもしれませんが、宜しくお願いします。。


魔界の仮面弁士  2007-11-13 02:06:23  No: 138103

> 「鍚」という文字がファイル名にある場合、
「金昜」かな?

> うまく取得できないようです。
Command 関数だと無理っぽいですね。
GetCommandLineW API もしくは CommandLineToArgvW API を使ってみてください。


魔界の仮面弁士  2007-11-13 02:15:51  No: 138104

これでどうかな?

'=====
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


バーバパパ  2007-11-13 18:55:28  No: 138105

魔界の仮面弁士さんありがとうございます!!
早速試してみましたが、「?」で表示されます。

プログラムに追加させていただいたのは、

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をインストール?しないと駄目なんですか?
基本過ぎてすいません・・


魔界の仮面弁士  2007-11-13 19:11:50  No: 138106

私のサンプルを、もう一度良く見てください。
文字列の確認に、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 のテキストファイルにする。


大吉末吉  2007-11-13 19:31:37  No: 138107

横から失礼。

> 早速試してみましたが、「?」で表示されます。
> MsgBox "GetCommandLine()" & GetCommandLine()

MsgBoxを使っては駄目なのでは?

VB6には、「Shift-JISにしかない文字を表示する機能」はないので、
MsgBoxだと、結局文字化けします。

魔界の仮面弁士さんのサンプルの様に
>     CreateObject("WScript.Shell").Popup "[" & S & "]"
UNCODE表示に対応した方法を使わないと・・・

#多分、この後行うつもりの「ファイル名を使ったファイルの操作」も
#VB6の組み込み機能だと動作しないのでは・・・


魔界の仮面弁士  2007-11-13 19:46:44  No: 138108

> VB6には、「Shift-JISにしかない文字を表示する機能」はないので、

# 何か違うような…。


大吉末吉  2007-11-13 20:22:42  No: 138109

> > VB6には、「Shift-JISにしかない文字を表示する機能」はないので、
> # 何か違うような…。

いい表現が思いつかなかったので・・・


魔界の仮面弁士  2007-11-13 22:13:46  No: 138110

>>バーバパパさん
という事で、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 メソッド等を使う必要があるでしょう。


大吉末吉  2007-11-13 23:03:12  No: 138111

> 魔界の仮面弁士さん

おっしゃるとおりです。
いろいろ捻くっている内に書き間違えた様です・・・(恥)

> バーバパパさん
紛らわしい発言になって、申し訳ありません。


バーバパパ  2007-11-13 23:34:43  No: 138112

>魔界の仮面弁士さん
素早い回答、本当に助かります。
すいません、MsgBoxでも使えるものだと思ってました。。
魔界の仮面弁士さんが書かれてたように、Popup メソッドを使ったら
無事文字を取得できました。
丁寧なご指導ありがとうございます。

>大吉末吉さん
ご指導ありがとうございます。

>#多分、この後行うつもりの「ファイル名を使ったファイルの操作」も
>#VB6の組み込み機能だと動作しないのでは・・・
そんな気がしてきました・・・・・・
現在、ユーザーと特殊文字をそもそも使用可にするかどうかで
相談になりました。

魔界の仮面弁士さんに提案していただいた
FileSystemObject の OpenTextFile メソッドを使って
色々試してみます。
またお世話になるかもしれません。。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加