2

UNICODE_STRING 構造を単純な NULL TERMINATED STRING に変換する必要があります。

typedef 
struct _UNICODE_STRING 
{
    USHORT  Length;  
    USHORT  MaximumLength;  
    PWSTR   Buffer;
} 
UNICODE_STRING, *PUNICODE_STRING;

それについてMSDNできれいな解決策が見つかりません。行ったことある人いますか?私は .net を使用していないので、ネイティブ API ソリューションが必要です。

どうもありがとう!

4

5 に答える 5

4

WideCharToMultiByteを使用する必要があります。出力バッファサイズの見積もりとして、[長さ]フィールドを使用できますが、真のマルチバイト文字列の場合を考慮してください。この場合、ERROR_INSUFFICIENT_BUFFERで失敗し、より大きなバッファで最初からやり直す必要があります。または、常に最初に出力バッファサイズ0で呼び出すため、必要なバッファサイズがわかります。

于 2008-11-03T14:03:10.833 に答える
2

Unicode 用にコンパイルして ansi に変換すると、これはうまくいくようです
( http://support.microsoft.com/kb/138813から変更):

HRESULT UnicodeToAnsi(LPCOLESTR pszW, LPSTR* ppszA){
    ULONG cbAnsi, cCharacters;
    DWORD dwError;
    // If input is null then just return the same.    
    if (pszW == NULL)    
    {
        *ppszA = NULL;
        return NOERROR;
    }
    cCharacters = wcslen(pszW)+1;
    cbAnsi = cCharacters*2;

    *ppszA = (LPSTR) CoTaskMemAlloc(cbAnsi);
    if (NULL == *ppszA)
        return E_OUTOFMEMORY;

    if (0 == WideCharToMultiByte(CP_ACP, 0, pszW, cCharacters, *ppszA, cbAnsi, NULL, NULL)) 
    {
        dwError = GetLastError();
        CoTaskMemFree(*ppszA);
        *ppszA = NULL;
        return HRESULT_FROM_WIN32(dwError);
    }
    return NOERROR;
}


使用法:

LPSTR pszstrA;
UnicodeToAnsi(my_unicode_string.Buffer, &pszstrA);
cout << "My ansi string: (" << pszstrA << ")\r\n";
于 2012-07-03T22:33:07.273 に答える
1

ANSI に変換され、WideCharToMultiByte にパラメーターとして渡す必要がある UNICODE_STRING の Unicode 文字数を必要としない代替コード。(UNICODE_STRING.Length はバイト数であり、Unicode 文字ではないことに注意してください。バッファがゼロで終了していない場合、wcslen は機能しません)。

UNICODE_STRING tmp;
// ...
STRING dest; // or ANSI_STRING in kernel mode

LONG (WINAPI *RtlUnicodeStringToAnsiString)(PVOID, PVOID, BOOL);
*(FARPROC *)&RtlUnicodeStringToAnsiString = 
    GetProcAddress(LoadLibraryA("NTDLL.DLL"), "RtlUnicodeStringToAnsiString");
if(!RtlUnicodeStringToAnsiString)
{
    return;
}

ULONG unicodeBufferSize = tmp.Length;
dest.Buffer = (PCHAR)malloc(unicodeBufferSize+1); // that must be enough...
dest.Length = 0;
dest.MaximumLength = unicodeBufferSize+1;

RtlUnicodeStringToAnsiString(&dest, &tmp, FALSE);
dest.Buffer[dest.Length] = 0; // now we get it in dest.Buffer
于 2012-11-16T02:01:19.877 に答える
0
WCHAR* UnicodeStringToNulTerminated(UNICODE_STRING* str)
{
  WCHAR* result;
  if(str == NULL)
    return NULL;
  result = (WCHAR*)malloc(str->Length + 2);
  if(result == NULL)
    // raise?
    return NULL;
  memcpy(result, str->Buffer, str->Length);
  result[str->Length] = L'\0';
  return result;
}
于 2012-03-11T18:25:40.180 に答える
0

ANSIまたはUNICODEのヌル終了文字列が必要かどうかを言わなかったので、UNICODEを想定します。

#include <string>

UNICODE_STRING us;
// fill us as needed...

std::wstring ws(us.Buffer, us.Length);
// use ws.c_str() where needed...
于 2012-07-04T00:53:36.937 に答える