조금 긴 내용이지만 기본적인 내용인지라. 쓱 둘러보시면 알수있는 간단한
소스입니다.
부디 끝까지 읽어주시고 도와 주시면 감사 하겠습니다.
이것은 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에 관련된 에러같은 에러 같은데 해결할 수 없어서 글을 올립니다.
알려주신다면 가문의 영광으로 생각 하겠습니다.