|
우선 질문부터...
아래 델파이 소스 StartPlugin함수 안에 보시면
SendModuleMessage(hInstance, P2M_REQINFO_SELECTUSER, Integer(@SelID), Length(SelID));
이 부분이 있는데요
SelID의 주소를 넘겨서 어떤 문자들이 담겨져 오게됩니다.
벼래별짓을 다해봤는데요
*를 주기도하고 (int)&SelID를 주기도했구요
그런데 값이 전달되어 오질 않습니다. ㅡ_ㅡ; 도와주세용 ㅡ_ㅡ;
어케 바꿔야할지도 모르겠습니다.
ㅡ_ㅡ;
또하나는.. DLL의 hInstance를 메시지를 줄때마다 던져줘야하는데요
C로 된 소스에보면 첫번재 함수에 있는 HINSTANCE 로 선언된 넘이 맞을까요?
첫번째 질문이 더 급합니다 ㅡ0ㅡ;
부탁드릴께용~
TProcPointer = Pointer;
TSendModuleMessage = function(hInstance: Integer; Msg: Cardinal; wParam: Integer; lParam: Integer): Integer; stdcall;
{Main Module 에서 필요한 플러그인 모듈의 정보를 구한다. Plugin -> Messenger}
function StartPlugin(sRegKey: Pchar; sStartInfo: PChar; pProc: TProcPointer; launCh: Integer): Integer; stdcall;
{메신져 의 시작}
var
SendModuleMessage: TSendModuleMessage;
plgRegKey: string;
plgStartInfo: PChar;
MyID: string;
implementation
function StartPlugin(sRegKey: Pchar; sStartInfo: PChar; pProc: TProcPointer; launCh: Integer): Integer; stdcall;
var
SelID: packed array[0..20] of Char;
ParceList: TStringList;
begin
plgRegKey := sRegKey; //메신져의 메인 레지스트리 키값이 넘어온다.
plgStartInfo := sStartInfo;
SendModuleMessage := pProc; //메신져 쪽으로
ParceList := TStringList.Create;
ParceList.Text := plgStartInfo;
MyId := ParceList.Strings[0]; //첫번째 인자로 부터 자신의 아이디를 받아온다.
ParceList.Free;
if launCh = 0 then begin
SendModuleMessage(hInstance, P2M_REQINFO_SELECTUSER, Integer(@SelID), Length(SelID));
end else begin
//상대방으로 부터 응답을 받았을때.
end;
Result := 0;
end;
이건 제가 빌더로 컨버팅한건데요
델파이에서 선언한 TProcPointer를 그냥 TSendModuleMesage로 선언하여 사용하였습니다.
typedef int (__stdcall *TSendModuleMessage)(int hInstance, unsigned int Msg, int wParam, int lParam);
extern "C" Export int __stdcall StartPlugin(char *sRegKey, char *sStartInfo, TSendModuleMessage pProc, int launCh);
TSendModuleMessage SendModuleMessage;
AnsiString plgRegKey;
char* plgStartInfo;
AnsiString MyID;
int MyhInstance;
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
MyhInstance = (int) hinst;
return 1;
}
//---------------------------------------------------------------------------
int __stdcall StartPlugin(char *sRegKey, char *sStartInfo, TSendModuleMessage pProc, int launCh)
{
AnsiString SelID;
TStringList *ParceList = new TStringList;
plgRegKey = sRegKey; //메신져의 메인 레지스트리 키값이 넘어온다.
plgStartInfo = sStartInfo;
SendModuleMessage = pProc; //메신져 쪽으로
ParceList->Text = plgStartInfo;
MyID = ParceList->Strings[0];
delete ParceList;
if(launCh == 0)
{
SendModuleMessage(MyhInstance, P2M_REQINFO_SELECTUSER, (int)*SelID, SelID.Length());
}
return 0;
}
//---------------------------------------------------------------------------
|