ページ 1 / 1
MultiByteToWideCharの宣言ミス?
Posted: 2005年11月16日(水) 04:19
by くま次郎
MultiByteToWideCharの定義に誤りがあるのではないでしょうか?
AB4.11には "api_system.sbp" にはこう宣言されていますが:
コード: 全て選択
Declare Function MultiByteToWideChar Lib "kernel32" (CodePage As DWord, dwFlags As DWord, lpMultiByteStr As BytePtr, cchMultiByte As Long, lpWideCharStr As WordPtr, cchWideChar As Long) As Long
「lpWideCharStr As WordPtr」は "WordPtr"ではなく
"BytePtr"にするべきではないのでしょうか?
私の勘違いでなかったらごめんなさい。
Posted: 2005年11月16日(水) 11:20
by 山本
MultiByteToWideCharは通常のマルチバイト文字をUNICODEに変換する関数です。で、lpWideCharStr パラメータはUNICODE文字列へのポインタ(格納される側です)になります。
UNICODE文字列というのは、一文字が2バイト(Word)で表現されるため、WordPtrが正しい表現ということで大丈夫だと思います。
VC6での宣言はこのようになっています [ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]
LPWSTRって、結局もとをたどるとunsigned shortなのです・・・。
Unicodeの文字型(WCHAR)、ポインタ型(LPWSTR)はきちんと定義してあげたほうがいいですな。そうすると、LPSTRもあったほうが、、、そんなことを言っていたら、TCHAR作って、UNICODEが#defineされているかをプリプロセッサで認識すれば・・・。
コード: 全て選択
typedef unsigned short wchar_t;
typedef wchar_t WCHAR; // wc, 16-bit UNICODE character
typedef WCHAR *LPWSTR, *PWSTR;
WINBASEAPI
int
WINAPI
MultiByteToWideChar(
UINT CodePage,
DWORD dwFlags,
LPCSTR lpMultiByteStr,
int cchMultiByte,
LPWSTR lpWideCharStr,
int cchWideChar);
Posted: 2005年11月16日(水) 20:16
by イグトランス
ちなみにVC .NetからはC++の規格どおりにwchar_tを基本型とするオプションが追加されています。
Posted: 2005年11月18日(金) 07:33
by くま次郎
文字列=BytePtrをつかう、という固定観念があったため
勘違いをしてしまったみたいです。
どうも失礼しました。
Posted: 2005年11月18日(金) 23:54
by マティ
ActiveBasicでサポートするunicodeは2バイト系のみだと理解してよろしいでしょうか?
3バイトとか4バイトの拡張コードもあるようなので、質問しました。
Posted: 2005年11月19日(土) 00:28
by イグトランス
ActiveBasicがというよりもWindowsがUnicodeのエンコードにUTF-16を使用しているので,
それに従っているに過ぎないだけのはずです。
ところでUCS2ではなく,UTF-16なのでサロゲートペアによって4Byteで1文字ということもありえます。