Q&A

  • dll호출 시 오류발생 질문 드립니다.
안녕하세요.

Indy HTTP 를 사용하여 DLL을 작성하여 사용중입니다만

DLL 함수를 호출하여 Parameter를 넘겨주면 Servlet에서 값처리후 전송데이터를 받아서 다시 보내주는 형식으로 개발중인데요.
[VB에서 dll호출 ---> DLL에서 Servlet호출 --> VB로 Return]

지금 현재 테스트 프로그램을 이용하여  dll을 테스트하면 아주 가끔씩 Access Violation 오류가 나타납니다.

VB에서는 dll호출 후 VB프로그램 자체가 죽어버리는 현상때문에 잡을 수가 없네요.

테스트 프로그램에서

implementation
function HttpReceiptSvr(OCSHEAD, OCSDATA, OCSTEMP : pchar) : Pchar; stdcall; external 'HttpDll.dll';
function HttpResultSvr(JOBGBN, RTNGBN, OCSHEAD, OCSDATA, OCSTEMP : pchar) : Pchar; stdcall; external 'HttpDll.dll';

   strData := '';
   for i := 0 to Form1.Memo4.Lines.Count -1 do
      strData := strData + Form1.Memo4.Lines.Strings[i];
   try
      strResult := HttpResultSvr(PChar(Form1.Edit5.Text),
                                 PChar(Form1.Edit11.Text),
                                 PChar(Form1.Edit6.Text),
                                 PChar(strData),
                                 PChar(Form1.Edit8.Text));
      //1. 위의 문장에서 dll은 정상처리 되지만 호출 후 Access            Violation 오류가 발생합니다.[리턴시 오류인것으로 추측]
      Form1.Memo2.Lines.add(strResult);
   except
      //2.그리고 여기로
      Form1.Memo2.Lines.Add('error--------------');
   end;

소스상에서 HttpResultSvr 이거 실행 시에 가끔 error--------- 이게 떨어지네요 ㅜㅜ
dll에서는 로그를 찍어봐도 정상적으로 처리가 다 되구요.

그리고 Dll소스는 아래와 같습니다.

      try
         Url := 'http://localhost/ResultSvr';
         IdHTTP1.Post(Url,source,response);

         rtn:= trim(response.datastring);

         Break;
      except on E: Exception do
         begin
            if i = 2 then
            begin
               try
                  if IdHTTP1 <> nil then
                     IdHTTP1.Free;
               except
               end;
               Result := '00016|';
               Exit;
            end;

            if pos('Connect', e.Message) > 0 then
            begin
               try
                  if IdHTTP1 <> nil then
                     IdHTTP1.Free;
               except
               end;
               Result := '00015|';
               Exit;
            end else
            begin
               i := i + 1;
            end;
         end;
      end;

dll을 초기화 해야 하는건지...아니면 다른 문제인지 급한데
감을 못잡겠습니다. 것두 30번 실행시 1번씩 떨어지는 문제라..
많은 조언 및 답변 부탁드립니다
0  COMMENTS