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
[5938] >질문< 구조체포인터 SendMessaage로 보내는 방법?
dashform [ ] 2246 읽음    1999-03-31 14:21
안녕하세요  꿈을 가진 소년 좋은 생각입니다.

아 요즘은 정말 잠잘 시간도 없군여...

역시 프로그램의 길은 멀고도 험난한것 같습니다...하지만 가는 길에 잼난것도 많으니

심심하지는 않아여...암튼 ...

32bit환경에서 만들어진 한 App에서 다른 App로 데이타(구조체)를 보낼때

OLE, DDE같은 것도 있지만 주로 쓰는 것이 [A[BSendMessage나 PostMessage를 사용해서 데이타를  넘기죠 그런데 16bit에서는 SendMessage의 lParam에 구조체 포이터를 담아서
데이타를 보내는데 아무런 문제가 없었습니다.

그런데 32bit로 넘어오면서 무슨 문제 인지 확실히 모르겠으나 SendMessage를 이용한

구조체 포인터를 다른 App로 넘길때 정확히 데이타가 전달되지 않거나 아예 보내어 지지
지도 않는 문제가 발생했씁니다. 해서 찾아본 결과 32bit에서 16bit에 없는 메세지가

가 있다는 것을 알았는데 바로 WM_COPYDATA라는 놈인데 32BIT에서 구조체 포인터를

보내려면 이놈을 이용해야 한다하더군요...

그런데 잘 되지 않습니다.  저의 경우는 SendMessage가 Dll안에 있지만 dll에 있든

App에 있던 SendMessage하는 데는 별차이가 없는 것으로 아는데...

암튼 WM_COPYDATA를 이용하여 다른 APP로 메세지를 보내어 보신문 도움 부탁합니다.

DLL 안의 SendMessage부분은
  New(aHllapiInfo);
  {IniParameterInfo(aHllapiInfo);}
  with aHllapiInfo^ do
  begin
    functionID := FuncID;
    ReturnCode := RetCode;
    DataLength := DataLen;
    DataString := DataStr;
  end;
  if ConnectedHwnd = 0 then exit;
  lpCopyData.dwData := 1;
  lpCopyData.cbData := SizeOf(aHllapiInfo);
  lpCopyData.lpData := aHllapiInfo;
  with aHllapiInfo^ do begin
    showmessage('FunctionID:'+inttostr(FunctionID^)+'Datastring'+strpas(DataString)+
                'DataLength:'+inttostr(DataLength^)+'ReturnCode:' + inttostr(ReturnCode^));
  end;
  showmessage('App-Handle:' + inttostr(Application.Handle) + 'ConnectedHwnd:' + inttostr(ConnectedHwnd));
  SendMessage(ConnectedHwnd, WM_COPYDATA, Application.Handle, LongInt(@lpCopyData));
  //SendMessage(ConnectedHwnd,WM_HLLAPIMSG,0,LongInt(aHllapiInfo));
  Dispose(aHllapiInfo);
...
이고

WM_COPYDATA를 받는 부분은
...
  procedure WMCopyData(var M : TMessage); message WM_COPYDATA;

...

Procedure TTPowerEMU.WMCopyData(var M: TMessage);
var
  aPHllapiInfo : PHllapiInfo;
begin
  showmessage('Power220의 CopyData루틴 진입');
  aPHllapiInfo := PHllapiInfo(PCopyDataStruct(M.LParam).lpData);
  showmessage('반복계수:' + inttostr(PCopyDataStruct(M.LParam).dwData));
  try
    with aPHllapiInfo^ do
    begin
      showmessage('aPHllapiInfo.FunctionID' + inttostr(aPHllapiInfo^.FunctionID^));
      showmessage('aPHllapiInfo.Datastring' + strpas(aPHllapiInfo^.DataString));

      case FunctionID^ of
        CONNECTPS      : HSConnect(aPHllapiInfo);
        DISCONNECTPS   : HSDisConnect(aPHllapiInfo);
        SENDKEY        : HSSendKey(aPHllapiInfo);
        WAIT           : HSWait(aPHllapiInfo);
[B[B
...
...

이렇게 됩니다.

위의 소스를 보면 아시겠지만 현상은 SendMessage부분에서의 값은 제대로 나오는데

SendMessaage를 거쳐서 다른 App로 제어권이 넘어와서 그값을 뿌려보면 구조체의 값이
제대로 안들어 있어 정말 미치겠습니다... 도저히 원인을 잘모르겠습니다.

즉 위에서 보면 dll로 부터 구조체에대한 정보가 제대로 않넘어 오기때문에 밑의

case FunctionID^ do 이루틴을 안타는 거죠 이루틴 않으로 가야 함수 이름값에 따라

그 함수에 맞는 함수를 호출하는데...

아무튼 도와주세요...제가 뭘 잘못했는지.. 어떻게하면 제대로 값을 넘길수 있는지

시간이 없습니다....정말...고수님들 도와주세요...

                        꿈의 언덕에서           /좋/은/생/각/...


+ -

관련 글 리스트
5938 >질문< 구조체포인터 SendMessaage로 보내는 방법? dashform 2246 1999/03/31
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.