2009-12-03 3 views
0

У меня есть структура, например, для примераКак преобразовать Byte * в LPCWSTR в wince6.0?

typedef struct { DWORD time;
BYTE * сообщение;
DWORD размер;
} ACCP_MESSAGE_COMMAND_PARAM_T;

Теперь это характерно как для основного, так и для клиента, а также для мастера, запрашивающего клиента со следующими данными 20, «MessageRequest», 30.

Теперь на стороне клиента я хочу отобразить сообщение, которое запрашивается мастером, используя% s. Но я могу отображать только через% c не на% s .. Кроме того, если iam конвертирует BYte * в LPCWSTR, как я должен достичь? BCZ всякий раз, когда я делаю так, он бросает исключение ..

Пожалуйста Ответить Благодарности Абхинит Агарвал

+0

Вы используете Windows Mobile6 или Windows CE6? – Shaihi

ответ

0

Вы посылаете строку в кодировке Юникод? Макрос TEXT() окружает строку, поэтому я думаю, что нет. Попробуйте распечатать его с помощью% S.

+0

В любом случае это не придет. он выдает следующее исключение: 43929 PID: 386000a TID: 20a000e Исключение 'Data Abort' (4): Thread-Id = 020a000e (pth = 94f994c8), Proc-Id = 0386000a (pprc = 97f54c20) 'onesegapp.exe' , VM-active = 0386000a (pprc = 97f54c20) 'onesegapp.exe' 43930 PID: 386000a TID: 20a000e PC = 40065470 (coredll.dll + 0x00055470) RA = 40070a94 (coredll.dll + 0x00060a94) SP = 0026fa1c, BVA = 00000002 53957 PID: 3b30006 TID: 3ca0006 Master accp_callback CALLED 53961 PID: 3b30006 TID: 3ca0006 ACCP_MSG_RES_ERROR CmdId: 50397184 AppKind: 3 param: & afd74 – Abhineet

+0

Имеет ли сообщение сообщение о завершении? Для какого размера используется? Почему вы не проходите LPWSTR в первую очередь? – Shaihi

+0

Является ли сообщение отправлено как широкоформатное в первую очередь? Посмотрите в отладчике, как представлен каждый символ. Широкий символ должен занимать 2 байта. – Shaihi

1

Вам нужно прочитать в Юникоде. Ваши данные в вашем вопросе («MessageRequest») не совпадают с вашими комментариями (L «MessageRequest»). Они разные, и вам нужно это понять. Посмотрите на представление памяти, чтобы увидеть, как они выложены.

Вы не сказали, как вы хотите «отображать» сообщение, но если он все еще Юникод, а клиент основан на CE, тогда делать нечего. CE использует только Unicode для всех своих API. Если это рабочий стол, используйте широкий («W» суффикс) или #define UNICODE в вашем приложении. Или преобразуйте его с помощью wcstombs или WideCharToMultiByte.

0

Ну, я получил решение для этого.

Если вы хотите конвертировать BYTE * в LPCWSTR, кроме использования WideCharToMultiByte то можно использовать следующим образом:

BYTE * message; 
message="MessageRequest"; 
WCHAR msg[100]; 
msg = (WCHAR)message; //Copy "message" content into "msg" . 
LPCWSTR msg1; //Taken variable of LPCWSTR type 
msg1=(LPCWSTR)msg; 

А затем отобразить его с помощью DrawText (...); на окне И вы сможете увидеть правильное сообщение.

+2

Это предполагает, что BYTE * указывает на данные, которые уже имеют широкий характер, а не многобайтовый, поэтому это * не * то же самое. Фактически вы могли бы просто передать BYTE * в TCHAR * или сделать простую memcpy для вашего нового местоположения. – ctacke

+1

Нет проблем в dll, из-за которых я получал проблему так что делая в вышеописанном методе моя проблема была решена. значение байта * было импортировано из dll, которое отображалось в% s способом только с помощью вышеуказанного метода. В любом случае комментарий, который вы отправляете, абсолютно прав, когда я проверил другие примеры, отличные от моей dll, которая создавала проблему для всего метода. – Abhineet

Смежные вопросы