2012-04-06 6 views
1

나는 내 응용 프로그램에서 다음과 같은 기능을 가지고 :PChar를 콘솔에 인쇄 할 때 왜 물음표가 나타 납니까?

function GetDeviceChannelInfo_HSI(PortNumber, Address, ChNumber: Integer; 
    var State: Integer): PChar; stdcall; external DLL_FILENEAME; 

내가하고 싶은 모든 콘솔에이 결과를 인쇄 할 수 있습니다. 그래도 무슨 일이 일어나면 WriteLn이라고 부르면 응답은 모두 ???????????입니다.

콘솔에서이를 인쇄하는 방법을 모르고 있다고 가정합니다. 아마도 그것은 유니 코드 또는 무언가이며 인쇄 할 수 없습니까?

저는 델파이를 처음 접했고, 왜 이것이 될 수 있는지 전혀 모르겠습니다. 포인터 주소를 실제로 인쇄하고 있습니까? 나는 정말로 모른다. 어떤 도움을 주시면 감사하겠습니다.

+0

함수 선언이 맞습니까? 대부분의 DLL 호출은 채우기 버퍼를 제공하도록 요청합니다. 당신은 버퍼를 할당하고, 그것을 전달하며, 리턴 할 때 버퍼는 DLL 정보로 채워진다. PChar를 반환하는 것은 아주 드문 일입니다. 왜냐하면 DLL이 메모리를 할당하고 호출 응용 프로그램에 포인터를 반환 할 것이기 때문입니다. DLL을 빌려줄 방법이 없습니다 (델파이/C++ 빌더에서 컴파일되고'ShareMem'을 사용하지 않는 한).). 당신이 사용하고있는 신고서는 어디서 났습니까? –

+0

PChar를 PAnsiChar로 변경하면 문제가 해결됩니다. 이것은 Ansi to Unicode 델파이 형식을 사용하지 않은 사람들 (PChar는'PAnsiChar '를 의미하는 것으로, 지금은 PWideChar를 의미 함)을 사용하지 않은 사람들로부터 나온 약 30 개의 질문과 중복됩니다. –

답변

1

음이 잘못된 경우 더 많은 코드를 게시 할 수도 있지만 작동하는

Var 
    FuncResult : String; 
Begin 
    FuncResult := GetDeviceChannelInfo(...); 
    WriteLn(FuncResult); 
End; 

같은 몇 가지 일을 예상 한 것입니다.

기본적으로 PChar에서 implicit cast를 String으로 강제 설정합니다.

+0

응답 해 주셔서 감사합니다. 나는 이것을 시험해 보았다.이 작업을 수행 할 때 결과는 ??????????가 아닌 빈 문자열입니다. 이유가 확실하지 않은 이유 – user489041

+0

이 함수가 알 수없는 PChar 인 PChar를 반환하는 동안 제안합니다. 결과를 해독하여이를 어떻게 처리해야하는지 파악해야합니다. –

3

포인터 주소가 인쇄되지 않습니다. 그렇다면 물음표가 아닌 주소 (10 진수 또는 16 진수)처럼 보이는 것을 얻을 수 있습니다.

Delphi 2009부터 PChar은 유니 코드 문자에 대한 포인터입니다. 해당 버전 또는 그 이후 버전을 사용하는 경우 해당 기능이 실제로 반환되는지 확인하십시오. 함수가 비 유니 코드 문자에 대한 포인터를 반환 할 가능성이 더 큽니다. 즉, 함수가 char*을 반환 한 C 코드에서 이것을 변환하면 반환 할 것입니다. 해당 유형의 올바른 델파이 변환은 PAnsiChar입니다.

실제 문자가 아니거나 현재 글꼴로 표현이없는 와이드 문자를 인쇄하면 종종 물음표가 나타납니다.

이전 델파이 버전을 사용하고 있는데이 함수가 실제로 PWideChar (C에서 wchar_t*)을 반환하면 함수가 넓은 문자를 제공 할 때 좁은 문자를 인쇄 할 때 반대 문제가 발생할 수 있습니다. 그러나 와이드 문자는 문제가되는 ASCII 문자이므로 첫 번째 문자를 인쇄하고 와이드 문자의 두 번째 절반을 구성하는 널 바이트를 만나면 프로그램이 멈 춥니 다.

디버거를 사용하여 실제로 갖고있는 것에 대한 아이디어를 얻을 수 있습니다. 함수가 제공 한 주소를 가져 와서 메모리 브라우저에서 해당 주소를 방문하십시오 (CPU보기의 일부). Delphi에서 문자, 넓은 문자 및 다양한 너비의 숫자를 비롯한 다양한 형식으로 메모리를 표시하게 할 수 있습니다. 또한 어떤 결과를 얻으 려는지 알면 도움이됩니다. 그런 다음 메모리의 패턴을 인식 할 수 있습니다.

관련 문제