아래와 같은 Dll을 사용할려고 합니다.
그런데 프로그램에서 dll을 호출하는데
GetProcAddress부분에서 값이 nil로 넘어옴니다. 어떻게 된건지요...
정말 모르겠습니다.
아시는분은 좀 알려주세요...
//Dll
library FirstDll;
uses
SysUtils,
Classes;
{$R *.RES}
function JuminValid(Str : String): Boolean; stdCall;
var
iNum : Integer;
begin
if Length(Str) <> 13 then
Result := False
else begin
iNum := 11 - (StrToInt(Str[1]) * 2 + StrToInt(Str[2]) * 3 + StrToInt(Str[3]) * 4 +
StrToInt(Str[4]) * 5 + StrToInt(Str[5]) * 6 + StrToInt(Str[6]) * 7 +
StrToInt(Str[7]) * 8 + StrToInt(Str[8]) * 9 + StrToInt(Str[9]) * 2 +
StrToInt(Str[10]) * 3 + StrToInt(Str[11]) * 4 + StrToInt(Str[12]) * 5) Mod 11;
case iNum of
10 : iNum := 0;
11 : iNum := 0;
end;
if iNum = StrToInt(Str[13]) then
Result := True
else Result := False;
end;
end;
exports
JuminValid Index 1;
begin
end.
//Dll호출하는 프로그램
unit TEST;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
type
TFunc = function(str : string) : boolean; stdcall;
var
H : THandle;
MyFunc : TFunc;
s : string;
begin
H := LoadLibrary('FirstDll.dll');
if H < 32 then
begin
ShowMessage('dll을 찾을수가 없다');
Exit;
end;
@MyFunc := GetProcAddress(H, 'JuminValid') ;
if @MyFunc = nil then
begin
ShowMessage('dll에서 함수 어드레스값을 받는데 실패했습니다.');
Exit;
end
else
begin
if (Not MyFunc(Edit1.text)) then
ShowMessage('o')
else ShowMessage('x');
FreeLibrary(H);
end;
end;
end.
지금 델파이가 없어서 온라인 상으로 쓰고 테스트는 못해보았지만,
아마도 될겁니다.
procedure TForm1.Button1Click(Sender: TObject);
type
TFunc = function(str : string) : boolean; stdcall;
var
H : THandle;
FuncPointer : Pointer;
MyFunc : TFunc;
begin
H := LoadLibrary('FirstDll.dll');
if H < 32 then
begin
ShowMessage('dll을 찾을수가 없다');
Exit;
end;
FuncPointer := GetProcAddress(H, 'JuminValid') ;
if FuncPointer = nil then
begin
ShowMessage('dll에서 함수 어드레스값을 받는데 실패했습니다.');
Exit;
end
else
begin
MyFunc := TFunc(FuncPointer);
if (Not MyFunc(Edit1.text)) then
ShowMessage('o')
else ShowMessage('x');
FreeLibrary(H);
end;
end;
end.
그럼 즐거운 프로그래밍 하세여~~