|
C++Builder에서 Project옵션을 건들지 않았으면
기본 Calling-Convention은 cdecl 입니다.
즉 ReadResultMainCbFunc 함수는 cdecl 입니다.
그런데 callback함수 type은 stdcall 이네요
ReadResultMainCbFunc 함수를 stdcall로 명시해주시면 될듯합니다.
-------------------------------
함수 앞에 붙는
fastcall , stdcall , cdecl 같은 키워드는 Calling-Convention이라고 합니다.
이놈은 함수를 호출할때 파라메터를 어떻게 전달할것인가와 관계가 되면
stack으로 전달할경우 stack을 어디서 해제하는가?
뭐 이런것을 결정해주느 키워드입니다.
Win32-API는 대게 stdcall 이며
가변파라메터 함수들은 cdecl을 쓰죠
델파이나 빌더에서는 fastcall을 많이씁니다.
저것을 잘못 정해주면 함수는 호출되지만..
파라메터가 이상하게 넘어오기도 하고..
callback함수 처리후 return후에 이상한 현상이 나기도 합니다.
그럼..
ppt 님이 쓰신 글 :
: 아래와 같이 코드를 작성했는데 이게 맞는지 좀 부탁드릴께요.
: dll 로드하고 export된 함수 호출까지는 되는 것 같은데 어째 다른 동작이 되질 않는 것 같아 혹시
: 문법에 문제가 있나 해서 문의 드립니다.
: 그럼 다들 즐거운 하루 보내세요~
:
: VC++ DLL에 아래와 같이 선언되어 있습니다.
: typedef void (__stdcall *ReadResultMainCbFunc)(char*, int); //Read Callback Function Pointer
: typedef BOOL (*PFN_JSetCallback)(ReadResultMainCbFunc);
: typedef BOOL (*PFN_JOpenPort)(UINT, UINT, int, int, int);
: typedef BOOL (*PFN_JSendData)(char*);
:
: 빌더쪽도 위와 동일하게 선언해 두었구요
: typedef void (__stdcall *ReadResultMainCbFunc)(char*, int);
: typedef BOOL (*PFN_JSetCallback)(ReadResultMainCbFunc);
: typedef BOOL (*PFN_JOpenPort)(UINT, UINT, int, int, int);
: typedef BOOL (*PFN_JSendData)(char*);
:
: HINSTANCE hInst;
: // 콜백함수 정의
: void ReadResultMainCbFunc(char* szbuf, int nlen)
: {
: ShowMessage("콜백데이터 처리");//return pBuffer;
: }
: // 버튼클릭
: void __fastcall TForm1::Button1Click(TObject *Sender)
: {
: PFN_JSetCallback SetCallBack;
: bool brtn;
:
: hInst = NULL;
:
: hInst = LoadLibrary("jdslib.dll");
:
: if (hInst)
: ShowMessage("Load Success");
: else
: ShowMessage("Load Fail");
:
: SetCallBack = (PFN_JSetCallback)GetProcAddress(hInst, "JSetCallback");
:
: if (SetCallBack)
: {
: // CallBack 함수 등록
: brtn = SetCallBack(ReadResultMainCbFunc);
: if (brtn)
: ShowMessage("Call Success");
: else
: ShowMessage("Call Fail");
: }
: else
: ShowMessage("Get Address Fail");
: }
|