1. 설명
WM_COPYDATA메시지를 이용해 다른 프로그램에 데이터를 전달한다.
단순 스트링 전달과 레코드 전달 예제로 구분했음

2. 소스

--단순 String 전달--

1. lParam에 사용할 데이터 레코드 타입
pCopyDataStruct = ^TCopyDataStruct;
 TCopyDataStruct = record
   dwData: DWORD;
   cbData: DWORD;
   lpData: Pointer;
 end;


2. lParam으로 전달된 데이터 읽기
strReceive := pChar(pCopyDataStruct(lParam)^.lpData);

3. 데이터 보내기
procedure TCommWndThread.SendData(AData: string);
var
  CopyData: TCopyDataStruct;
  nLen: integer;
begin
  nLen := Length(AData) + 1;
  AData := AData + #0;

  with CopyData do
  begin
    cbData := nLen;
    lpData := pChar(AData);
  end;

  SendMessage(FWnd, WM_COPYDATA, 0, LongInt(@CopyData));
end;

--레코드 전달--

1. 전달할 레코드 타입
  pMemoDataStruct = ^TMemoDataStruct;
 TMemoDataStruct = packed record
   FSenderID: String[50];
    FIP: String[20];
   FPort: String[10];
   MemoContent : array[1..1024] of char;
 end;

2. 데이터 보내기
var
 CopyData: TCopyDataStruct;
 nLen: integer;
 memoinfo : TMemoDataStruct;
begin
 FillChar(memoinfo, sizeof(TMemoDataStruct), #0);
 memoinfo.FSenderID := FSenderID;
 memoinfo.FIP := FIP;
 memoinfo.FPort := FPort;

 Move(FMemo^,memoinfo.MemoContent,FMemoSize);

 nLen := SizeOf(memoinfo);

 with CopyData do
 begin
   cbData := nLen;
   lpData := @memoinfo;
 end;
 SendMessage(wnd, WM_COPYDATA, LongInt(msgType), @CopyData);
end;

3. 데이터 받기
var
  memoinfo : TMemoDataStruct;
begin
   memoinfo :=  pMemoDataStruct( PCopyDataStruct(msg.LParam)^.lpData)^;
end;
Posted by Gu Youn
,
1. 설명
C++ 빌더에서는 메시지 맵을 이용하지만 델파이에서는 message라는 키 워드를 이용해서 프로시져를 선언한다.
WM_TEST 메시지가 발생하면 OnWmTest 프로시져가 호출된다.

2. 소스
const
 WM_TEST = WM_USER + 9999;

procedure OnWmTest(var Msg: TMessage); message WM_TEST;

procedure OnWmTest(var Msg: TMessage);
begin
 Application.MessageBox('WM_TEST','',MB_OK);
end;
Posted by Gu Youn
,
개념 : 프로그램 전역으로 뮤텍스를 생성해서 이후에 다시 뮤텍스를 생성하면 에러가 발생하는 것을 이용해서 프로그램을 한번만 실행되게 제어한다.

소스 :

어플리케이션의 메인 유닛에서 다음과 같이 작업한다.
windows유닛 추가

var
  Mutex : THandle;
begin

  Mutex := CreateMutex(nil, True, 'NoDuplicate');
  //GetLastError : 이미 이 프로그램의 뮤텍스가 존재하면 183 리턴
  if (Mutex <> 0 ) and (GetLastError = 0) then
  begin
    //프로그램 처음 시작되는 경우 코드
    Application.CreateForm(TSendMemoForm, SendMemoForm);
    Application.Run;
    if Mutex <> 0 then CloseHandle(Mutex);
  end
  else
  begin
    //이미 프로그램이 실행되있는데 다시 실행하는 경우.
    Application.MessageBox('프로그램이 이미 실행 중입니다.','경고',MB_OK);
  end;
Posted by Gu Youn
,