2017-09-06 3 views
0

ANSIからUnicodeに変換して戻す際に問題があります。次のコードは、私がやっていることを説明しています。私は0x57エラーが発生します。..いくつかのより多くの引数がByValキーワードを渡す必要がQB64のWideCharToMultiByte

DECLARE DYNAMIC LIBRARY "kernel32" 
    FUNCTION MultiByteToWideChar& (codePage~&, dwFlags~&, lpszMbstring$, byteCount&, lpwszWcstring$, wideCount&) 
    FUNCTION WideCharToMultiByte& (codePage~&, dwFlags~&, lpWideString$, BYVAL ccWideChar%, lpMultiByte$, BYVAL multibyte%, BYVAL defaultchar&, BYVAL usedchar&) 
    FUNCTION GetLastError&() 
END DECLARE 
DIM Filename AS STRING * 260, NewFilename AS STRING * 260, MultiByte AS STRING * 260 
PRINT "Enter filename";: INPUT Filename$: 'Filename$ = Filename$ + CHR$(0) 
x = MultiByteToWideChar(0, 0, Filename$, LEN(Filename$), NewFilename$, 260) 
IF x = 0 THEN 
    PRINT "Error 0x"; HEX$(GetLastError) 
ELSE 
    PRINT "Processing: "; NewFilename$ 
END IF 
' do unicode stuff here 
x = WideCharToMultiByte(65001, 0, NewFilename$, LEN(NewFilename$), MultiByte$, 0, 0, 0) 
' display processed filename 
IF x = 0 THEN 
    PRINT "Error 0x"; HEX$(GetLastError) 
ELSE 
    PRINT MultiByte$ 
END IF 

答えて

1

:それはさておき

FUNCTION MultiByteToWideChar& (BYVAL codePage~&, BYVAL dwFlags~&, lpszMbstring$, BYVAL byteCount&, lpwszWcstring$, BYVAL wideCount&) 
FUNCTION WideCharToMultiByte& (BYVAL codePage~&, BYVAL dwFlags~&, lpWideString$, BYVAL ccWideChar%, lpMultiByte$, BYVAL multibyte%, BYVAL defaultchar&, BYVAL usedchar&) 

STRING * 260の長さに関係なく、任意の値を格納し、常に260です。これは、またはWideCharToMultiByteのいずれかがNULL終了入力を必要としないことを意味するわけではありません(つまり、byteCountccWideCharのパラメータが存在し、時には文字列の一部でしか動作しない場合があります)。あなたは、INPUTLINE INPUTは、任意の残りのバイトは、明示的に(CHR$(32)Filenameを締結していない入力されますASCIIZ文字列を使用して物事に対処できるようにするために0にFilenameのすべてのバイトを設定する_MEMFILLを使用している場合でも

さらに悪いことに、すなわち空白スペースバーを押したかのように)。たとえば、「He​​llo」と入力すると、入力された文字列は5バイト、文字コードは32バイト(16進数の場合は&H20)になります。

この恐ろしい頭痛( "hello world.bas"は有効なファイル名です!)を保存するには、STRINGではなくSTRING * 260を使用します。長さが260より大きい場合は、おそらくエラーメッセージを出力する必要があります。新しいファイル名の入力を許可するかどうかは、あなた次第です。

DIM Filename AS STRING 
DIM NewFilename AS STRING * 260 
DIM MultiByte AS STRING * 260 
... 

' Note: LEN(NewFilename) = 260 (**always**) 
' This is why the number of wide chars written 
' is saved. 
NewFilenameLen = MultiByteToWideChar(0, 0, Filename, LEN(Filename), NewFilename, LEN(NewFilename)) 

... 

' Note: LEN(MultiByte) = 260 (**always**) 
x = WideCharToMultiByte(65001, 0, NewFilename, NewFilenameLen, MultiByte, LEN(MultiByte), 0, 0) 

... 
+0

[OK]を、おかげで再び:それはNewFilenameの文字数であるため

はまたMultiByteToWideCharの戻り値を使用したいと思います。それはちょうど私は一緒にすべてのコードをまとめるためにちょうどそれを行う必要があります。 – eoredson

+0

ところで:なぜFindFirstFileWはNULとして.cAlternateFilenameを返しますか? – eoredson

+1

'cAlternateFilename'は' cAlternateFilename'がすでに8.3ファイル名でなければ、docsはDOS 8.3形式のファイル名が 'cAlternateFilename'にあると述べています。この場合、' cAlternateFilename'は空文字列です。例えば ​​'foo.txt'は空の' cAlternateFilename'メンバーになり、 'HelloWorld.txt'と' foo.config'は 'HelloW〜1.txt'と' foo〜7.con'になります。 –

関連する問題