안녕하세요 델파이를 하다가 궁금한게 있어서요..
아무리 뒤져보고 그래도 어떻게 해야할지 모르겠어여.. ㅠ.ㅠ
초,중,고수님들... 부탁 드립니다.
다른 업체에서 콜백함수를 이렇게 만든다는데요.
----------------------------------------------------------
생성할 function
{define-proc public {proc-callback str:String, num:int}:String
public {proc-callback str:String, num:int}:String
----------------------------------------------------------
저희쪽에서 함수를 만들때 이렇게 만들어놨는데요.
dll.pas ----------------------------------------------------------
type
TCallBack =function (str:String; num:Integer): Integer; cdecl;
var
CallBack : TCallBack = nil;
Function Check(Filename : PChar; CallBack : TCallBack) : Integer; Export;
var
iFile : Integer;
begin
iFile := 1;
ShowMessage('AAA');
result := iFile;
end;
----------------------------------------------------------
이렇게 했는데요..
저기서 넘어오는 파라메터는
Check('C:\AAA', ????)
이렇게 넘어오는데요 물음표 있는데가 콜백함수 들어가는곳이구요
이제부터 질문 드릴께요... ^^;
제가 콜백함수에 정의는 게시판같은거 봐서 대충 알겠는데
in, out 이 어떻게 이뤄지는지 그걸 잘 모르겠어요..
콜백함수와 파라메터를 업체에 받아서 제가 만드는 dll을 실행시키면
그 dll에서 콜백함수를 제가 함수를 만들어서 실행을 시켜서 다시 뿌려주는건가요?
또하나.. 저걸 델파이로 콜백 테스트를 하려고 하는데요..
testform.pas-----------------------------------------------------------------------------------
type
TCallBack = function (str:String; num:Integer): String; stdcall;
var
Call_Back : TCallBack;
Function Check(Filename : String; call_back : TCallBack) : Integer; external 'JavaParsingDLL.dll';
procedure TForm1.Button2Click(Sender: TObject);
begin
Check2('AAAA',call_back('1',1));
end;
----------------------------------------------------------------------------------
이렇게 폼 하나 만들어서 짯는데...
일단 call_back에서 에러가
Incompatible type: 'TCallBack' and 'String'
이런식으로 나오는데요..
저런식으로 dll 과 testform을 하면되는건가요?
도와주세요.... ㅠ.ㅠ
콜백만 삼일째 보고있어요.. ㅠ.ㅠ
위의 예를 보면 JavaParsingDLL.dll에 있는 Check함수를 호출하면 Check함수에서 call_back 파라매터로 넘어온 콜백함수주소를 이용해서 실행시키는것이죠.
때문에 DLL의 Check함수를 호출할때는 그냥 콜백함수의 주소를 넘겨주시면 됩니다.
Check('AAAA', @call_back);
DLL이 자바인것같은데... 델파이의 String형하고 호환되는 데이터형이 없을건데요... 아마도 PChar형으로 해야 할것입니다.
아래는 예제입니다.
type
TCallBackFunc = function (No: Integer): Integer;
function CallBackImpl(No: Integer): Integer;
// Callback함수, 구현해야합니다.
begin
Result := No *100;
end;
function ExecCallBack(No: Integer; CallBack: TCallBackFunc): Integer;
// 질문에서 'JavaParsingDLL.dll'에 있는 Check함수와 똑같은 역활을 하는 함수죠...
begin
Result := CallBack(No);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage( IntToStr( ExecCallBack(10, @CallBackImpl) ));
end;