CからVBに変換


[コメントツリー表示を見る] [発言時刻順表示を見る]

Posted by 今市 on 2001/07/27 14:09:38

    こんにちは。いつも拝見していますが初めてお世話になります。
    早速ですが、WEBからLoadString()APIに相当すると思われるCの下記
    サンプルを発見しました。勉強のため、これをVBに変換しているので
    すが、Cの知識が乏しいためどうしても解からない所(下記鎖線部)
    があります。そこをVBに変換するにはどのようにすれば宜しいので
    しょうか? ご教授の程、宜しくお願い致します。

    int LoadStringEx(HINSTANCE hInstance, UINT uID, WORD wLanguage, LPTSTR lpBuffer, int nBufferMax )
    {

    HGLOBAL hGlb=NULL;
    LPWSTR lpwsz=NULL;
    LPVOID lpMsgBuf=NULL;
    ULONG lSize(0);
    HRSRC hRsrc = FindResourceEx(hInstance, RT_STRING,
    MAKEINTRESOURCE((uID>>4)+1) , wLanguage);
    if (!hRsrc ) {
    lpMsgBuf=NULL;
    FormatMessage(
    FORMAT_MESSAGE_ALLOCATE_BUFFER |
    FORMAT_MESSAGE_FROM_SYSTEM |
    FORMAT_MESSAGE_IGNORE_INSERTS,
    NULL,
    GetLastError(),
    MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
    (LPTSTR) &lpMsgBuf,
    NULL
    // Display the string.
    ::MessageBox(NULL, static_cast(lpMsgBuf), "Error", MB_OK |
    MB_ICONINFORMATION );

    // Free the buffer.
    LocalFree( lpMsgBuf );
    return 0;
    }

    hGlb = LoadResource(NULL, hRsrc);
    lpwsz = static_cast(LockResource(hGlb));
    //increment the pointer in the resource block up to the required string
    for(UINT i(0),nStrLen(0);i<(uID & 15);i++,nStrLen=lpwsz++[0]) {
    lpwsz+=nStrLen; //jump over preceding resources in the block
    }

    size_t nRet = wcstombs(wcstombs(lpBuffer, lpwsz, min(nStrLen,(size_t)
    nBufferMax));

    lpBuffer[nRet]='\0';
    return nRet;
    }

    'VBに変換したコード(関数の引き数、戻り値を変更してます。)
    Function LoadStringEx(hInstance As Long, uID As Long, wLanguage As Long) As String

    Dim strBuffer As String '引数を移動(文字列型に変更)
    Dim nBufferMax As Long '引数を移動
    Dim hGlb As Long
    Dim lpwsz As Long
    Dim strMsgBuf As String * 512 '(文字列型に変更)
    Dim hRsrc As Long

    hRsrc = FindResourceEx(hInstance, RT_STRING, Clng(uID \ 16 + 1), wLanguage)
    If (hRsrc = 0) Then
    Call FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM Or _
    FORMAT_MESSAGE_IGNORE_INSERTS, _
    ByVal 0&, Err.LastDllError, LANG_USER_DEFAULT, _
    strMsgBuf, Len(strMsgBuf), ByVal 0&)
    strMsgBuf = Left$(strMsgBuf, Instr(strMsgBuf, vbNullChar) - 1)
    MsgBox strMsgBuf, vbOKOnly Or vbInformation, "Error"
    Exit Function
    End If

    hGlb = LoadResource(hInstance, hRsrc)

    '---- ここからが解かりません --------------------------------
    lpwsz = static_cast(LockResource(hGlb));
    for(UINT i(0),nStrLen(0);i<(uID & 15);i++,nStrLen=lpwsz++[0]) {
    lpwsz+=nStrLen; //jump over preceding resources in the block
    }

    size_t nRet = wcstombs(wcstombs(lpBuffer, lpwsz, min(nStrLen,(size_t)
    nBufferMax));
    '---- ここまで ---------------------------------------------

    LoadStringEx = strBuffer
    End Function


記事スレッド一覧