C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
분야별 포럼
C++빌더
델파이
파이어몽키
C/C++
프리파스칼
파이어버드
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

자유게시판
세상 살아가는 이야기들을 나누는 사랑방입니다.
[15344] 임프님께서 올려주신 TBX diff 중에서
와이군 [yypbd] 4686 읽음    2008-11-12 20:21
임프님께서 올려주신 Toolbar2000하고 TBX 적용하고 테스트하던 도중 이상한 현상이 나와서 리포팅드립니다.
올려주셨던 diff patch까지 모두 적용하고 Toolbar2000의 Demo 프로젝트 돌려보다가 툴바에 올려진 Edit부분을 클릭하니 글자가 깨지고 프로그램 종료시에 오류가 나더라구요.

TB2ExtItems.pas 워닝나길래 찾아보니 GetHandleTextW, SetHandleTextW 함수에서 워닝나길래 고쳐봤습니다.

Toolbar2000 원본소스에는 없는걸 보니 아마도 diff 적용 후에 나온것 같습니다.

변환시에 String을 바로 PWideChar로 형변환시켜서 문제가 발생한 할로 보입니다.

function GetHandleTextW(const Handle: HWND): String;
var
  S: String;
  L: Integer;
  WS: WideString;
begin
  SetLength(Result, 0);
  if Handle = 0 then Exit;
  if IsWindowUnicode(Handle) then
  begin
    L := GetWindowTextLengthW(Handle);
    SetLength(WS, L + 1);
    GetWindowTextW(Handle, PWideChar(WS), L + 1);
    SetLength(WS, L);
    Result := WS;
  end
  else
  begin
    L := GetWindowTextLength(Handle);
    SetLength(S, L + 1);
    GetWindowText(Handle, PChar(S), L + 1);
    SetLength(S, L);
    Result := S;
  end;
end;

procedure SetHandleTextW(const Handle: HWND; const S: String);
var
  WS: WideString;
begin
  if IsWindowUnicode(Handle) then
  begin
    WS := S;
    SetWindowTextW(Handle, PWideChar(WS));
  end
  else
    SetWindowText(Handle, PChar(S));
end;

WideString으로 받은담에 PWideChar로 형변환시켜주니 데모 프로그램이 정상적으로 돌아가네요.


어데다가 올려야 할지 -_-;;
팁이라고 하기에도 뻘쭘해서 자게에 올려봅니다.
와이군 [yypbd]   2008-11-12 21:24 X
델파이 2007입니다.
집에 오는길에 생각해보니 2009에서는 string이 WideString이니 문제가 없었겠네요.
IsWindowUnicode 대신에 델파이 버전으로 체크해버려야 하려나요. -_-;
김도완 [purplecofe2]   2008-11-13 00:30 X
흠. 문자열 비교를 보면 widestring과 unicodestring이 차이가 있더군요.
반복적인 문자열의 처리에서는 widestring과 shortstring은 피하라는 결론을 가집니다.
2009가 없어서 확실하게 어떨련지 모르겠네요.
김상구.패패루 [peperu]   2008-11-13 09:04 X
결론만 말씀드리면.. WideString은 BSTR을 취급해야 하는 경우가 아니면 절대 쓰시 않으시는 것이 좋습니다.
박지훈.임프 [cbuilder]   2008-11-13 11:45 X
와이군님이 지적하신 내용이 정확하게 맞습니다. 제가 실수를 했네요.
툴바2000+TBX를 사용한 프로젝트가 끝난 직후에 패치 작업을 했었기 때문에 충분히 테스트를 할 시간이 없었습니다. 죄송~

컴포넌트 자료실의 해당 게시물에도 수정된 파일을 새로 올렸습니다.
http://delphi.borlandforum.com/impboard/impboard.dll?action=read&db=component&no=547

와이군님께 감사~ ^^
와이군 [yypbd]   2008-11-13 13:12 X
켁 죄송하다뇨
올려주신거 감사하게 쓰구 있습니다~ ^^

+ -

관련 글 리스트
15344 임프님께서 올려주신 TBX diff 중에서 와이군 4686 2008/11/12
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.