VC++에서 만든 DLL은 전문을 생성한뒤 전송하고 응답 전문을 수신한뒤 필요한
4가지 정보를 돌려줍니다.
델파이에서 이 4가지 정보를 돌려받기 위해 구조체를 이용했습니다.
DLL에서 구현은 기능은 다 됩니다.
문제는 호출을 했던 프로그램(델파이, 소스부분포함)이 종료되면서
그림과 같은 에러가 발생합니다. 도저히 이제 지쳐서..
그림에서 보면 타이틀에 소켓이라고 적히는데 그것과 무슨 연관이 있는지..
암튼 고수님들의 답변 좀 부탁드립니다. --;
대강의 형태는 아래와 같습니다.
--------------------------------------------------------------------------------
| VC++에서 DLL 소스입니다. --------------------------------------------------
--------------------------------------------------------------------------------
DllType int __stdcall CaAuthRequest(CASHMemberRes *pCaResBuf,int nTrdNo,long nSupAmt,long nVatAmt,long nSvcAmt,int nTrader,int nTrdYn, char* sCheckNo,int nPinYn)
{
return theApp.m_oCaAuth.CaAuthRequest(pCaResBuf,nTrdNo,nSupAmt,nVatAmt,nSvcAmt,nTrader,nTrdYn,sCheckNo,nPinYn);
}
DllType int __stdcall CaAuthRequestA(CASHMemberRes *pCaResBuf,int nTrdNo,long nSupAmt,long nVatAmt,long nSvcAmt,int nTrader,int nTrdYn, BSTR sCheckNo,int nPinYn)
{
return theApp.m_oCaAuth.CaAuthRequest(pCaResBuf,nTrdNo,nSupAmt,nVatAmt,nSvcAmt,nTrader,nTrdYn,(char *)sCheckNo,nPinYn);
}
typedef struct
{
char AuthNum[9];
char BussinessName[20];
char ResCode[4];
char ResMsg[20];
}CASHMemberRes;
int CaAuthRequest(CASHMemberRes *pCaResBuf, int nTrdNo, long nSupAmt, long nVatAmt,long nSvcAmt,int nTrader,int nTrdYn, char* sCheckNo,int nPinYn);
int CCaAuthComm::CaCallAuthRequest(int nTrdNo, long nSupAmt, long nVatAmt,long nSvcAmt,int nTrader,int nTrdYn, char* sCheckNo,int nPinYn,char* sYYYYMMDDHHMMSS,char* sAuthNum)
{
}
--------------------------------------------------------------------------------
| 델파이에서 DLL 호출하는데 소스입니다. ----------------------------------------
--------------------------------------------------------------------------------
function CaAuthRequest(pReqBuf: PCAppr; nTrdNo, nSupAmt, nVatAmt,nSvcAmt, nTrader,nTrdYn : integer; sCheckNo : pchar; nPinYn:integer):integer; stdcall; external 'ktauthcomm.dll' Name 'CaAuthRequestA';
type
PCAppr = ^CAppr;
CAppr = record
AuthNum : array[0..8] of char ;
BussinessName : array[0..19] of char ;
ResCode : array[0..3] of char ;
ResMsg : array[0..19] of char ;
end;
procedure TForm1.sbtn_AuthReqClick(Sender: TObject);
var
TmpC : PCAppr;
i : integer;
pLogFile : String;
begin
SetServer(pchar(edt_SvrIP.Text), StrToInt(edt_SvrPort.Text));
New(TmpC); // <- 이거로 할당하고
pLogFile := 'd:\test.log';
i := SetLogFile(1, pchar(pLogFile));
i := CaAuthRequest(TmpC,
StrToInt(edt_BillNo.Text),
StrToInt(edt_SupAmt.Text),
StrToInt(edt_VatAmt.Text),
StrToInt(edt_SvcAmt.Text),
StrToInt(edt_TraderGbn.Text),
Strtoint(edt_TrdGbn.Text),
pchar(edt_ChkNoGbn.text),
strToint(edt_PinGbn.Text)
);
ListBox1.Items.Clear;
ListBox1.Items.Add(' "' + TmpC^.AuthNum + '"');
ListBox1.Items.Add(' "' + TmpC^.BussinessName + '"');
ListBox1.Items.Add(' "' + TmpC^.ResCode + '"');
ListBox1.Items.Add(' "' + TmpC^.ResMsg + '"');
Dispose(TmpC); // <- 이거로 메모리 해제 했습니다.
MessageDlg('작업완료', mtInformation,[mbOk],0);
// 여기 다 실행되고 ListBox1에 결과 다 나오도록 에러는 안납니다.
// 그러나 델파이에서 프로그램을 종료하는 순간 그림과 같은 에러가 나옵니다.
end;
우회하면 어떨까 합니다.
동작도 잘 되고 하면
굳이 종료시점에 장애나는 것을 없애려고 하지마시고
장애나는 화면을 안보이게 하는 게 어떻겠습니까?