Q&A

  • [질문]SendMessage로 다른 프로그램에 문자열을 보내고싶은데..
SendMessage로 다른 프로그램에 문자열을 보내기 위해
지금까지  WMCopyData메세지를 가지고 잘 써왓습니다
그런데 어떤 필요에 의해 WM_USER을 써서 문자열을 보내려고 합니다
Wparam과 lparam에 어떠한 형변환을 해서 보내고
받는 쪽에서도 어떻게 CopyMemory를 해야하는지 잘 모르겟습니다
고수님의 도움 부탁드립니다
<!--CodeS-->
****보내는 쪽

pData:string;

        PData:='Now SendString';
        wnn:=FindWindow(nil,'TESTFORM');
        SendMessage(wnn, WM_USER+20, Longint(PChar(pData)),0);

****받는쪽
    procedure WMUserString(var Message: TMessage); message WM_USER_+20;


procedure TForm1.WMUserString(var Message: TMessage);
var
    DataStr:string;
    MyData:Pointer;
begin
   MyData := @Message.WParam;
   DataStr:= string(MyData);
   Memo1.Lines.Add('1->'+PChar(MyData));
   Memo1.Lines.Add('2->'+DataStr);
end;
<!--CodeE-->
받는쪽에서는 이상한 깨진 문자가 나오는데요
어디가 잘못되었슨지요

3  COMMENTS
  • Profile
    홍성락 2008.12.17 22:42
    Message.WParam의 내용값이 문자렬 시작 주소라서
    그냥 DataStr:= PChar(Message.WParam); 또는 DataStr:= string(Message.WParam); 받으세요
    그리고 PChar가 호환도 좋아요
    그래서 보낼때도 깨지지 않게 #0를 붙여 준다든지, 구조체로해서 문자열 길이도 보내서 띄어쓰든 엔터를 치든 특수기호가 들어가든
    그대로 전송하도록 하는게 좋습니다(구조체 예로 TCopyDataStruct)

    var
    pData:string;
    sandData : PChar;
    begin
    PData:='Now SendString' + #0;
    sandData := pChar(AData);

    ......
    end;


  • Profile
    최용일 2008.12.17 23:22
    WM_USER로는 문자열을 받기 힘들건데요... 양쪽 프로세스 간의 주소쳬계들이 달라서 전송을 해봤자 쓸 수가 없습니다.
    File mapping같은 공유 메모리를 사용하지 않은 한은 방법이 없습니다.
    정 WM_COPYDATA를 쓰시기 싫으시다면 Memory Mapped File을 쓰세요. 그냥 문자열 주소 보내는 것은 않됩니다.
  • Profile
    이정욱 2008.12.18 04:13
    아니면 소켓 놓고.. 127.0.0.1 로컬로 문자 주고 받으셔도...ㅡㅡ;
    • 김현철
    • 2008.12.18 19:42
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 난난난난
      2008.12.19 02:24
      일반적으로는 메모안에서 enter를 치면 다음칸으로 나옵니다. 님의 경우는 화면에 KeyPreview := True...
    • 김현철
      2008.12.19 18:02
      답글 감사합니다! 님의 얘기대로 했더니... 메모에서 포커스가 없어졌습니다. 포커스가 다음으로 이동...
    • 이강석
      2008.12.18 18:21
      페이지 틀린 곳의 버튼 speed1이고 누르려고 하는 버튼이 speed2라면 speed1Click이벤트 코딩하는 부분...
    • 전봉수
      2008.12.18 20:36
      // 입력탭의 수정 스피드버튼 실행 및 에디터에 값 넣기 IF PAGECONTROL1.ActivePage = TABSHEET1 THEN ...
    • 이강석
      2008.12.18 02:42
      구분되어 있는 다른 스피드 버튼을 눌러지게 한다는 말이 혹시 현재 탭 말고 다른 탭에 있는 버튼을 어떤...
    • 이정욱
      2008.12.18 04:11
      그냥 그 이벤트 호출 해주시면 되는데요.... 만약 Button1Click 로 되어있다면, Button1Click(Button1) ...
    • 전봉수
      2008.12.18 05:32
      이강석님 이정욱님 답변감사합니다. 이강석님 말씀 대로 입니다. "단" 어떤 시점이 아니고 수동으로 눌...
    • 홍성락
      2008.12.18 07:39
      말씀하신걸 직역하면 어떤 스피드 버튼을 클릭하는게 아니라 눌러진 상태로 만든다는 말씀이시지요. 1. ...
    • 전봉수
      2008.12.18 11:25
      홍성락님 답변 감사합니다. 저의 질문을 다른방향으로 이해시신것 같씁니다. 제가질문 들인것은 스피드...
    • 홍성락
      2008.12.18 18:25
      그렇다면 위의 이정욱님 말씀대로하면 될건데요...같은 폼이라면 아무리 페이지컨트롤로 나뉜다하여도 같...
    • 전봉수
      2008.12.18 20:35
      // 입력탭의 수정 스피드버튼 실행 및 에디터에 값 넣기 IF PAGECONTROL1.ActivePage = TABSHEET1 THEN ...
    • 꼬꼬마
    • 2008.12.17 23:45
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2008.12.18 01:40
      Cells에 들어가는 값이 Row, Column순입니다. 이것만 잘 맞추시면 될것같은데요... idx변수가 요일을 나...
    • 꼬꼬마
      2008.12.18 21:43
      근데요// 어떤식으로 해야 되는거져? 일자에 기준으로 데이터를 뿌려주려고 하는데; 이거 생각보다 잘...
    • 최용일
      2008.12.19 02:16
      글쎄요... 그렇게 말씀하시면 더이상 할 말이 없는데요... 데이터들이 들어가야 할 셀의 위치를 다 알고...
    • 이경애
    • 2008.12.17 21:46
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 홍성락
      2008.12.17 22:42
      Message.WParam의 내용값이 문자렬 시작 주소라서 그냥 DataStr:= PChar(Message.WParam); 또는 DataSt...
    • 최용일
      2008.12.17 23:22
      WM_USER로는 문자열을 받기 힘들건데요... 양쪽 프로세스 간의 주소쳬계들이 달라서 전송을 해봤자 쓸 수...
    • 이정욱
      2008.12.18 04:13
      아니면 소켓 놓고.. 127.0.0.1 로컬로 문자 주고 받으셔도...ㅡㅡ;
    • 김현철
    • 2008.12.17 15:22
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2008.12.17 20:01
      쿼리 자체를 안한다면 모를까... 쿼리한 필드를 없앨 수는 없구요... 업데이트할 때 TUpdateSQL을 써서 ...
    • 김현철
      2008.12.17 20:44
      현재 사용하고있는 컴퍼넌트가 dbexpress에 있는 것을 사용하다보니... TUpdateSQL를 쓰기에는 좀..... ...
    • 이강석
      2008.12.17 18:37
      단순히 위에 코드만 적어주시면 어떤 부분에서 에러나 나는지 익셉션이 나는건지 알 수가 없을거 같은데....
    • 윤박사
      2008.12.17 19:09
      If Not AThread.Terminated And AThread.Connection.Connected Then Begin Try ...
    • 최용일
      2008.12.17 23:27
      서버쪽 소스같은데... AThread.Terminate;는 왜하시는지 모르겠네요... 이유가 있겠죠... 암튼... 서...
    • 이강석
      2008.12.17 23:38
      음...ReadBuffer말고 ReadLn으로 읽으셔서...구조체의 맨마지막에 종료문자코드를 주시고 읽으시면 안되...
    • 이강석
      2008.12.17 23:40
      type TCommBlock = record Msg : array[1..5000] of Byte; ...
    • 이정욱
      2008.12.18 04:15
      근데.. 왜 Record로 하셨는지..... 위 같은 식이라면 그냥.. var Msg : array[1..5000] of Byte; ...
    • 최용일
      2008.12.17 19:17
      델파이7은 Update1까지 나와 있습니다. 설치해주시면 될것같네요... 관련 파일은 코드기어 홈페이지에 ...
    • 맥스
      2008.12.18 00:04
      최 용 일 님 ^^ Update1 해주는거랑 안해주는거..차이 많이 나나여 ?
    • 최용일
      2008.12.18 05:27
      글쎄요... 차이에 대해선 생각해본적이 없어서... 그래도 여러가지 버그들도 고쳐졌고 했으니까 Update...
    • phono
      2008.12.18 18:40
      update1을 패치해 주지 않으면.. ado 와 연동되는 TAdo 쿼리의 sql.add 같은 펑션 사용하여 쿼리문...
    • 맥스
      2008.12.18 19:49
      phono님.. update1 패치 다운로드 꽁짜 맞아여? 불법 델파이를 써서요 ;;
    • lee, js
    • 2008.12.17 03:29
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 밴댕이
    • 2008.12.17 02:53
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2008.12.17 04:34
      TCanvas.TextOut보다는 API의 ExtTextOut이나 DrawText/DrawTextEx같이 글자를 클립핑해서 쓸 수 있는 함...
    • 이강석
      2008.12.17 18:40
      열때 오류가 발생하는건 대부분 컴포넌트를 사용한 소스를 컴포넌트가 없는 상태에서 열때 날거 같긴한데...
    • 구창민
      2008.12.16 01:11
      안녕하세요... BringToFront 와 SendToBack 을 이용해 보세요.. 즐거운 프로그래밍 하시구요~
    • 이강석
      2008.12.17 23:44
      패스워드나 암호를 login.cgi로 넘길때 login_id.Text나 login_pw.Text는 에디트일거 같은데 단순한 문자...
    • 귀여운대빵
      2008.12.18 02:35
      앗^^ 답변 감사합니다. 아래방식으로 해결되었습니다. procedure setcookies; var i, count:int...
    • 양용성
      2008.12.13 03:21
      오라클에 트랜잭션이 생겼는지 검사하는 방법은 연결이 끊었을 경우나 트랜잭션이 있는지 확인하려고 ...
    • 허수진
    • 2008.12.13 00:26
    • 0 COMMENTS
    • /
    • 0 LIKES
    • cell
    • 2008.12.12 18:48
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 바람
      2008.12.12 19:36
      Procedure Val 과 혼동되는건 아닌지요 변수명 Val을 딴 이름으로 바꿔보세요
    • 김현철
    • 2008.12.12 02:45
    • 5 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2008.12.12 03:14
      에러메세지로 보면 아웃룩이 설치안되어 있는것 같네요... 방법1,2둘다 별 차이없구요. 반드시 Micros...
    • 김현철
      2008.12.12 03:33
      답글 감사합니다. 여러 글을 읽는 중에 봤음에도 불구하고 정확히 이해를 못해서 헤매고 있었네여! 자...
    • 최용일
      2008.12.12 03:55
      델파이7이면 FastNet컴포넌트(TNMSMTP) 대신에 Indy 9버전이 기본으로 들어가 있을건데요... Indy로 메...
    • 김현철
      2008.12.12 04:40
      최용일님... 혹시 http://www.delphi.co.kr/zboard/view.php?id=tips&no=1395 기억하시나여? 좋은 샘...
    • 최용일
      2008.12.12 06:06
      파일 첨부 기능만 추가하시면 되겠네요...
    • 남호성
    • 2008.12.12 00:56
    • 0 COMMENTS
    • /
    • 0 LIKES