Q&A

  • Dll을 사용할려고 하는데요...
아래와 같은 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.
1  COMMENTS
  • Profile
    구창민 2003.04.16 02:27
    호출하는 부분을 아래처럼 바꾸어서 해보세여.

    지금 델파이가 없어서 온라인 상으로 쓰고 테스트는 못해보았지만,

    아마도 될겁니다.

    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.

    그럼 즐거운 프로그래밍 하세여~~