Как преобразовать вывод FormatMessage в сообщение об исключении Java в JNI под Windows? - PullRequest
1 голос
/ 16 октября 2011

Я пытаюсь преобразовать ошибку Windows в исключительную ситуацию ввода-вывода Java с помощью функции ниже:

void ThrowIOException(JNIEnv * env, LPCTSTR lpszFunction, DWORD dw) 
{ 
LPVOID lpMsgBuf;

FormatMessage(
    FORMAT_MESSAGE_ALLOCATE_BUFFER | 
    FORMAT_MESSAGE_FROM_SYSTEM |
    FORMAT_MESSAGE_IGNORE_INSERTS,
    NULL,
    dw,
    MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
    (LPTSTR) &lpMsgBuf,
    0, NULL );


//    MessageBox(NULL, (LPCTSTR)lpDisplayBuf, TEXT("Error"), MB_OK); 
    LPVOID lpDisplayBuf = (LPVOID)LocalAlloc(LMEM_ZEROINIT, 
        (lstrlen((LPCTSTR)lpMsgBuf)+lstrlen((LPCTSTR)lpszFunction)+40)*sizeof(TCHAR)); 
    StringCchPrintf((LPTSTR)lpDisplayBuf, 
        LocalSize(lpDisplayBuf),
        TEXT("%s failed with error %d: %s"), 
        lpszFunction, dw, lpMsgBuf); 



jclass Exception = env->FindClass("java/io/IOException");
if(env->ThrowNew(Exception, (const char *)lpDisplayBuf)){
    printf("Can't throw IOException: %s\n", lpDisplayBuf);
}


LocalFree(lpMsgBuf);
LocalFree(lpDisplayBuf);
}

Я использую Unicode в своем проекте VC. IOException генерируется успешно, но сообщение в lpDisplayBuf не отображается должным образом.

Мне известно, что приведение lpDisplayBuf к "const char *" может быть неправильным, но я не знаю, как это исправить.

1 Ответ

0 голосов
/ 17 октября 2011

Если ваш VC-проект настроен как UNICODE, вам необходимо преобразовать строку, возвращенную из FormatMessage, в ANSI, как в следующем примере (обратите внимание, что я поставил no проверка ошибок вообще)


// This is the main DLL file.

#include "stdafx.h"
#include "jni.h"
#include 

extern "C" 
{
JNIEXPORT jstring JNICALL Java_jnihellowworld_sayIt(JNIEnv *env, jobject obj)
    {
        jclass excClass;
        LPVOID lpMsgBuf;
        char buffer[1000];

        FormatMessage(
            FORMAT_MESSAGE_ALLOCATE_BUFFER | 
            FORMAT_MESSAGE_FROM_SYSTEM |
            FORMAT_MESSAGE_IGNORE_INSERTS,
            NULL,
            2,
            MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
            (LPTSTR) &lpMsgBuf,
            0, NULL );

        excClass = env->FindClass("java/io/IOException");

        ::WideCharToMultiByte(CP_ACP, 
                        0, 
                        (LPCWSTR) lpMsgBuf, 
                        -1, 
                        buffer, 
                        1000, 
                        NULL, 
                        NULL);

        LocalFree(lpMsgBuf);
        env->ThrowNew(excClass, buffer);

        return env->NewStringUTF("never reached");
    }
}

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...