DLL 실행관련하여 문의드립니다.
프로그램 구조는 아래와 같습니다.
1. 메인 프로그램에 파라메터를 입력합니다.
2. 메인 프로그램에서 받은 파라메터로 DLL을 호출합니다.
2. DLL 안에 있는 쿼리가 실행됩니다.
3. DLL에서 처리된 데이터를 메인 프로그램으로 돌려줍니다.
데이터는 1개 또는 그 이상일 수 있으므로, 배열 또는 리스트로 받으려고 합니다.
***************************************************************
DLL 소스
DLL안에 데이터모듈이 있습니다. (SQLConnection, SQLQuery 사용)
***************************************************************
// 데이터 조회
function SearchData ( Input : String ) : PChar; stdcall;
var
sText : String;
MAIN_SQL : String;
begin
Result := PChar( '' );
MAIN_SQL := '';
MAIN_SQL := MAIN_SQL + #13 + 'SELECT * FROM 테이블 ';
MAIN_SQL := MAIN_SQL + #13 + ' WHERE ';
MAIN_SQL := MAIN_SQL + #13 + Format(' 조건절 = ''%s'' ' , [ Input ] );
// ShowMessage( MAIN_SQL );
with COM_DM.SQLQuery1 do
begin
Close;
SQL.Clear;
SQL.Text := MAIN_SQL;
Open;
ShowMessage( MAIN_SQL );
if IsEmpty = True then
begin
ShowMessage( '검색된 데이터가 없습니다.' );
Exit;
end;
while not Eof do
begin
sText := Fields[00].AsString + ';' + Fields[01].AsString + ';' + Fields[02].AsString;
ShowMessage( sText );
Result := PChar( sText );
Next;
end;
end;
end;
***************************************************************
메인 프로그램 소스
***************************************************************
procedure TForm3.ButtonGetDataClick(Sender: TObject);
type
TSearchData = function ( Input : String ) : PChar; stdcall;
var
SearchData : TSearchData;
H : HINST;
S : PChar;
begin
Memo1.Lines.Clear;
H := LoadLibrary( PChar( ImportDLLFile ) );
if H <= 0 then
begin
ShowMessage( '로딩 에러 : ' + IntToStr( GetLastError ) );
end
else
begin
try
@SearchData := GetProcAddress( H, PChar( 'SearchData' ) );
if @SearchData = nil then
begin
ShowMessage( 'DLL 함수의 Address를 가져오지 못했습니다!' );
Exit;
end;
S := SearchData( PChar( Edit1.Text ) ); <-- 디버그하면 여기서 에러 나옵니다.
if H <> 0 then
begin
Memo1.Lines.Add( S );
end
else
begin
ShowMessage( 'ERROR!!' );
end;
finally
FreeLibrary( H );
end;
end;
end;
<
<