home ホーム search 検索 -  login ログイン  | reload edit datainfo version cmd icon diff delete  | help ヘルプ

日記/2010/04/12/XNResourceEditorで同じID, 異なる言語の文字列リソースがうまく取得出来ない。 (v1)

日記/2010/04/12/XNResourceEditorで同じID, 異なる言語の文字列リソースがうまく取得出来ない。 (v1)

日記 / 2010 / 04 / 12 / XNResourceEditorで同じID, 異なる言語の文字列リソースがうまく取得出来ない。 (v1)
id: 642 所有者: msakamoto-sf    作成日: 2010-04-12 22:29:24
カテゴリ: Windows プログラミング 

"String Table"リソースを追加し、"Neutral"と"日本語"、二つのテーブルで同じIDで異なる文字列を用意した後、

  1. FindResourceEx()で、MAKELANGIDで日本語用の言語IDを指定
  2. LoadResource()でグローバルハンドル取得
  3. LockResource()でLPVOIDポインタ取得

すると、一応UNICODE文字列(WCHAR)のデータが取得出来たのだが、中身はNeutralで指定した文字列になっている。

XN Resource Editorの問題か、そもそもリソースデータのバイナリ表現上の制限でうまく区別出来ないか。

とりあえず、「一つのリソースファイル内の文字列リソースで、同じリソースID+異なる言語」は止めておいた方が余計なトラップに嵌らなくて済みそう。

MAKELANGIDで日本語のIDを作成し、FindResourceEx()で文字列リソースを取得するサンプル:

#include <windows.h>
#include <stdio.h>
 
void PrintErrorMsg(DWORD err)
{
    LPTSTR lpMsgBuf;
    FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER
        | FORMAT_MESSAGE_FROM_SYSTEM 
        | FORMAT_MESSAGE_IGNORE_INSERTS,
        NULL, err,
        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
        (LPTSTR)&lpMsgBuf, 0, NULL);
    printf("%s\n", lpMsgBuf);
    LocalFree(lpMsgBuf);
}
 
int main(int argc, char *argv[])
{
    HINSTANCE hCurrentInst;
    HRSRC hResRc;
    HGLOBAL hGlobal;
    DWORD dwSizeofRes;
    char *buf = NULL;
 
    hCurrentInst = GetModuleHandle(NULL);
 
    hResRc = FindResourceEx(
        hCurrentInst, 
        RT_STRING, 
        MAKEINTRESOURCE(1), 
        MAKELANGID(LANG_JAPANESE, SUBLANG_JAPANESE_JAPAN)
    );
    if (NULL == hResRc) {
        PrintErrorMsg(GetLastError());
        return -1;
    }
 
    dwSizeofRes = SizeofResource(hCurrentInst, hResRc);
    if (0 == dwSizeofRes) {
        PrintErrorMsg(GetLastError());
        return -2;
    }
    printf("size = %d\n", dwSizeofRes);
    
    hGlobal = LoadResource(hCurrentInst, hResRc);
    if (NULL == hGlobal) {
        PrintErrorMsg(GetLastError());
        return -3;
    }
    
    buf = (char*)LockResource(hGlobal);
    if (NULL == buf) {
        PrintErrorMsg(GetLastError());
        return -4;
    }
    printf("string resource : [%s]\n", buf);
 
    return 0;
}

※なお、最後のprintf()は上手く動きません。本来ならtchar.hをincludeしてUNICODE対応させる必要があります。(参考: C言語系/memos/VC++/03, UNICODE対応とtchar.h
じゃぁどうやって中身を確認したの?ですが・・・OllyDbgで確認(爆)。


プレーンテキスト形式でダウンロード
表示中のバージョン : 1
現在のバージョン : 2
更新者: msakamoto-sf
更新日: 2010-04-13 12:54:31
md5:966a615635367e204798758202c0f83f
sha1:2ea7cbbccdb35a1cd6015bd4b0da5110d4e90414
コメント
コメントを投稿するにはログインして下さい。