ActiveBasicのバグと思われる不具合を発見された方は、こちらから知らせていただけると助かります。
くま次郎
#1
投稿記事
by くま次郎 » 2005年11月16日(水) 04:19
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"にするべきではないのでしょうか?
私の勘違いでなかったらごめんなさい。
山本
Site Admin
記事: 535 登録日時: 2005年5月30日(月) 15:08
#2
投稿記事
by 山本 » 2005年11月16日(水) 11:20
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);
イグトランス
記事: 899 登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
#3
投稿記事
by イグトランス » 2005年11月16日(水) 20:16
ちなみにVC .NetからはC++の規格どおりにwchar_tを基本型とするオプションが追加されています。
くま次郎
#4
投稿記事
by くま次郎 » 2005年11月18日(金) 07:33
文字列=BytePtrをつかう、という固定観念があったため
勘違いをしてしまったみたいです。
どうも失礼しました。
マティ
記事: 161 登録日時: 2005年8月23日(火) 00:15
お住まい: 沖縄県
#5
投稿記事
by マティ » 2005年11月18日(金) 23:54
ActiveBasicでサポートするunicodeは2バイト系のみだと理解してよろしいでしょうか?
3バイトとか4バイトの拡張コードもあるようなので、質問しました。
イグトランス
記事: 899 登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
#6
投稿記事
by イグトランス » 2005年11月19日(土) 00:28
ActiveBasicがというよりもWindowsがUnicodeのエンコードにUTF-16を使用しているので,
それに従っているに過ぎないだけのはずです。
ところでUCS2ではなく,UTF-16なのでサロゲートペアによって4Byteで1文字ということもありえます。