2017-10-22 4 views
-2

제가 작업중인 C 프로젝트가 있는데 문제가 있습니다. 프로그램은 .php 페이지에 의해 반향되는 문자열을 읽습니다. 당신이 데이터를 수신하는 명령() 함수로 전송됩니다 볼 수 있듯이LPBYTE를 char * 또는 C (중국어 출력)로 변환하는 작업에 어려움이 있습니다.

LPSTR szBuffer=(LPSTR)chunk+0x1000; 
DWORD dwRead; 

if (CWA(_HttpSendRequestA, wininet, hHttpRequest, szHeaders, lpstrlenA(szHeaders), szReq, lpstrlenA(szReq)) != 0) 
    { 
     CWA(_InternetReadFileA, wininet, hHttpRequest, szBuffer, 0x400, &dwRead); 
     if (dwRead) 
      Commands((LPBYTE)szBuffer, dwRead); 
    } 

: 그것은 데이터를 읽고() 명령으로 전송받을 변수로 기능을 임명이 코드 를 사용 LPBYTE szBuffer (함수의 "command") 및 DWORD dwRead (함수의 "size").

Commands() 함수에서 .php 페이지에서 읽은 문자열을 읽어야합니다. 그러나 데이터가 LPBYTE로 저장되어있는 것처럼 보이기 때문에 char *로 변환하려고하는 많은 작업을 수행했습니다. 그러나 내가 마침내 그것을 얻었다고 생각했을 때 MessageBox를 사용하여 출력하려고했습니다 (읽어야하는 문자열이 표시되는지 확인하기 위해). 원래 문자열이 있어야한다하면서 그러나, 이것은 (나 한자를 반환

"TASKci = 0C73CCFD206BBD011E7087CE0806E6F6E69630, 작업 = dlex, TI = AD62A5950B76F3812C542C24040EACE9, 홍보 = https를 통해 UR = // test.com/test.txt,cl = "

그것은 나 반환 무엇의 스크린 샷 :. http://prntscr.com/h0p5iw

명령의 내부 코드() 보이는 방법 :

BOOL Commands(LPBYTE command, DWORD size) { 

LPTSTR x = (LPTSTR)((char*)command); 

{ 

     int msgboxID = MessageBox(
     NULL, 
     x, 
     (LPCWSTR)L"Woop",  
     MB_ICONWARNING | MB_CANCELTRYCONTINUE | MB_DEFBUTTON2); 

} 


CWA(Sleep, kernel32, 100); 

return 1; } 

내가 난 단지 C#으로 물건을 서면으로 작성했습니다 (C에 새로 온 사람을 전에) 그래서 나는 바보 같은 질문을하면 미안해. , 정말 최선을 다했는데 혼자서 어떤 해결책을 찾지 못하는 것 같습니다.

또한, Commands() 기능 내의 내용을 제외한 모든 항목은 저에게 코딩 된 것이 아니라 더 많은 경험이있는 사람에 의해 코딩되었음을 명심하십시오. 이 코드는 잘되어야하며 페이지에서 데이터를 읽는 것이 확실합니다. 어쩌면 변환 어딘가에있는 것일 수도 있습니다.

+0

'LPSTR szBuffer = (LPSTR) 청크 + 0x1000'이란 무엇입니까? 'char szBuffer [0x1000] = {0}'을 의미합니까? 이 'CWA'기능은 무엇입니까? 귀하의 프로젝트가 유니 코드 인 것 같지만 ANSI 기능을 강요합니다. '(LPTSTR)'캐스트를 사용하여 오류를 숨기고 있습니다. WinAPI 함수 (예 :'HttpSendRequest')를 사용해야합니다. 또는'HttpSendRequestA' 그리고 당신이 ANSI를 원한다면. 귀하의 코드에는 많은 매크로, 형변환 및 자유로운 코드가 포함되어 있습니다. 'LPTSTR'과 다른'T' 매크로는 초보자들에게는 매우 혼란 스러울 수 있으므로 피하십시오. –

+0

그들이 선택한 문자 인코딩에 대해 더 많은 경험이있는 사람에게 물어보십시오. 'MultiByteToWideChar'를 사용하여 와이드 캐릭터 라인으로 변환하려면 알 필요가 있습니다. [모든 소프트웨어 개발자가 절대적으로 최소로 절대적으로, 절대적으로 유니 코드와 문자 집합에 대해 알 필요가 있습니다! (변명의 여지가 없습니다!)] (https://www.joelonsoftware.com/2003/10/08/the-absolute-minimum- 모든 소프트웨어 개발자 - 절대적으로 - 반드시 - 반드시 - 알아야 할 - 유니 코드 및 문자 세트 - 변명의 여지가 없음). – IInspectable

+0

유형 불일치 오류에 대한 현재의 접근 방식은 A가 B 유형이 아닌 경우에도 A를 B로 변환하여 컴파일러에게 거짓말하는 것 같습니다. 컴파일러 오류를 이해하려고 시도해야합니다. 그들을 무시하지 마라. –

답변

3

좁은 문자열 (char *) tends to look like Chinese 너비가 넓은 UTF-16 유니 코드 문자열이 필요한 곳에서 사용할 때.

해당 유형을 변경하기 위해 문자열을 전송할 수 없으면 MultiByteToWideChar으로 전화해야합니다.

+0

또는,'MessageBoxA'를 호출하고 소스 문자열이 ANSI 인코딩 (스레드의 현재 코드 페이지 사용) 또는 ASCII 인코딩을 사용하는 경우 변환을 수행하도록하십시오. – IInspectable