こんにちは。いつも拝見していますが初めてお世話になります。 早速ですが、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
|