Delphi Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
델파이 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
FreePascal/Lazarus
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
델마당
볼랜드포럼 광고 모집

델파이 Q&A
Delphi Programming Q&A
[15507] Re:Re:Re:두분의 친절한 답변 감사합니다.
첫눈 [hadugo] 2409 읽음    2015-04-25 15:26
최근 몇일 계속 질문만 올리면서 많은 것을 배우고 있습니다.
진심으로 감사합니다.

정영훈 님이 쓰신 글 :
: 64비트라서 그런 것이 아니라 델파이 2009 부터 유니코드 기반으로 변경이 되었습니다.
:
: 윈도우 api가 ansi string 과 wide string 으로 구분되어 있습니다.
: MessageBoxA, MessageBoxW 식으로 말이지요.
:
: MessageBox로 예를 들면 델파이 2007 이하에서는 MessageBox 호출시 MessageBoxA 를 호출하게 되어있었는데 2009부터는 MessageBoxW 로 호출되게 변경되었습니다.
: 이렇게 유니코드 기반으로 바뀌게 되면서 해당 문자열의 바이트 크기등을 계산하려면 각 문자의 크기를 곱하는 작업을 해줘야 합니다.
: Length(sendString) * SizeOf(Char)  <- 이런식으로 해당 문자열의 바이트 크기를 얻어야 하위 호환성 보장이 되는 코드가 됩니다.
: 델파이 2007 이하 버전이면 char 가 ansichar 이므로 1바이트가 되고 2009 이상 버전이면 char가 widechar 가 되어 2바이트가 됩니다.
:
: 첫눈 님이 쓰신 글 :
: : 데이터를 전송할때
: :
: :    copyDataStruct.cbData := Length(sendString) + 1;
: : 

: : 이렇게 했는데요.
: :
: : 이 부분을
: :
: :
: :    copyDataStruct.cbData := (Length(sendString) + 1) * 2;
: : 

: : 이렇게 수정하니 정상적으로 데이터가 들어오네요.
: :
: : 64비트 윈도우에서 32비트로 컴파일해서 그런게 아닌가 의심스러운데
: : 만일 OS문제라면 소스코드에서 OS가 몇 비트OS인지 검사해야 하지 않을까요?
: :
: : 그런데 문제는 제가 OS가 몇비트인지 검사하는 방법을 모르겠습니다. ㅡ,.ㅜ
: :
: :
: : 첫눈 님이 쓰신 글 :
: : : ================================= 전송부 ============================
: : :
: : : var
: : :   copyDataStruct: TCopyDataStruct;
: : :   sendString : String;
: : : begin
: : :   sendString := '1234567890';
: : : 
: : :   copyDataStruct.dwData := 0;
: : :   copyDataStruct.cbData := Length(sendString) + 1;
: : :   copyDataStruct.lpData := PChar(sendString);
: : : 
: : :   RemoteHWND := FindWindow('TForm1','TestWin');
: : :   SendMessage(RemoteHWND, WM_COPYDATA, Application.Handle, Integer(@copyDataStruct)) ;
: : : end;
: : : 

: : :
: : : ================================= 수신부 ============================
: : :
: : : private
: : :     procedure WMCopyData(var Msg: TMessage); message WM_COPYDATA;
: : : 
: : : ....
: : : 
: : : procedure TForm1.WMCopyData(var Msg: TMessage);
: : : var
: : :   copyDataStruct : PCopyDataStruct;
: : :   dwData : Integer;
: : :   DataLength : Integer;
: : :   getData : String;
: : : begin
: : :   copyDataStruct := Pointer(Msg.LParam);
: : :   dwData  := copyDataStruct.dwData;
: : :   DataLength := copyDataStruct.cbData;
: : :   getData := PChar(copyDataStruct.lpData);
: : :   ShowMessage(getData);  <============= 여기서 '1234567890'이 아닌 '12345'까지만 나옵니다.
: : : end;
: : : 

: : :
: : : 보낼때는 '1234567890'이라고 보냈는데 받을때는 '12345'까지만 받고 가끔씩 데이터의 뒷부분이 이상한 글자로 나올때도 있습니다.
: : :
: : : 어디가 잘못된건가요?
: : :
: : : 설마 OS가 Win7 64Bit라 그런건 아니겠죠?

+ -

관련 글 리스트
15503 WMCopyData로 데이터를 전송하면 5글자까지만 나옵니다. 첫눈 3795 2015/04/24
15504     Re:자답과 추가 다른 질문 첫눈 2523 2015/04/24
15506         Re:Re:자답과 추가 다른 질문 civilian 2497 2015/04/24
15505         Re:Re:자답과 추가 다른 질문 정영훈 2606 2015/04/24
15507             Re:Re:Re:두분의 친절한 답변 감사합니다. 첫눈 2409 2015/04/25
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.