Q&A

  • TQuery를 이용하는 DLL (2주동안 고민했습니다.)
조금 긴 내용이지만 기본적인 내용인지라. 쓱 흘터보시면 알수있는 간단한 소스입니다.

부디 끝까지 읽어주시고 도와 주시면 감사 하겠습니다.







이것은 TQuery객체와 거래처코드, 지점코드, 지점명을 매개변수로 하는 DLL입니다.



site.dll ->

************************

Procedure worksite ( argQuery : TQuery ;

argGubun : String = 'i' ;

argCust : String = '000001';

argCode : String = '' ;

argName : String = '') ; StdCall;

Begin

With argQuery Do Begin

Sql.Clear;

Sql.Add(' INSERT INTO HL_SITE ');

Sql.Add(' VALUES ');

Sql.Add(' (:HS_CODE, :HC_CODE, :HS_NAME) ');

ParamByname('HC_CODE').AsString := Trim(argcust);

ParamByname('HS_CODE').AsString := Trim(argcode);

ParamByname('HS_NAME').AsString := Trim(argname);

ExecSql;

End;

End;



exports

worksite name 'worksite';



begin

end.





*************************

이것은 StringGrid의 내용을 site.dll에 적용하여 DB에 입력하려는 부분입니다.



site.dll 호출부분 ->

*************************

Type TFworksite = procedure ( argQuery : TQuery ;

argGubun : String= 'i' ;

argCust : String= '000001';

argCode : String= '' ;

argName : String= '') ; StdCall;



~

~





var HD : THandle;

Fworkcust : TFworkcust;

Fworksite : TFworksite;

CQuery : TQuery;

i : integer;

begin



HD := LoadLibrary('c:misdllsite.dll');



㉠ CQuery := nil;

㉡ CQuery := TQuery.Create(Application);

㉢ CQuery.DatabaseName := MisDM.Database1.databaseName;



For i := 0 To SGridSite.RowCount - 1 Do Begin

@Fworksite := GetprocAddress(hd,'worksite');

SGridSite.Row := i;

FworkSite(CQuery, 'i', CCust, SGridSite.Cells[0,i], SGridSite.Cells[1,i]);

End;

CQuery.Close;

FreeLibrary(hd);

****************************

그런데 처음 한건의 입력만 완료되고 두번째 For 이하 문에서 다음과 같은 에러를 만났습니다.

'Access violation at address 40002456 in module 'VCL40.BPL'.

'Read of address FFFFFFFF'



그래서 CQuery초기화 부분 ㉠㉡㉢을 For문 안의로 넣어 보기도 하고,

HD := LoadLibrary('c:misdllsite.dll') 부분을 넣어보기도 했는데 역시 똑같은 에러가 발생합니다.



분명히 Query에 관련된 에러같은 에러 같은데 해결할 수 없어서 글을 올립니다.

알려주신다면 가문의 영광으로 생각 하겠습니다.





0  COMMENTS