Q&A

  • Dll 에러 인데요. 고수님들.. 도와주세요
dll에 대해 폼을 만들었는데 AccessViolation 에러가 납니다.

자꾸 포인터 부분에서요...

부탁드립니다. 제가 델초보라서요. 아무리 애를 써두 안되서요.

고수님들 부탁드립니다.



이것에 대해서 설명하자면 childMDI에서 변수에 값을 입력하여 DLL의 MDIChild에서

그 값의 포인터를 참조하여 값을 보여주려구 합니다...



부탁합니다.. 급해요....................................



//---------------------------- Dll입니다.---------------------------------

library dbmdc;



uses

Windows,

Classes,

Controls,

Forms,

URecordForm in 'URecordForm.pas' {RecordForm};



procedure CreateChild(AParentApplication: TApplication; ADBRec: pDBRec); export; stdcall;

begin

Application:= AParentApplication;



with TRecordForm.Create(Application) do

begin

ParentApplication:= AParentApplication;

Label1.Caption := '제가 바로 MDI폼이예요.....';

Label2.Caption := ADBRec^.aName ;

Show;

end;

end;



procedure DLLUnloadProc(Reason: Integer); register;

begin

if Reason = DLL_PROCESS_DETACH then Application := DllApplication;

end;





exports

CreateChild;



begin

DllApplication := Application;

DLLProc := @DLLUnloadProc;

end.



//-------------------------------------------------------------------------

//----------------선언참조URecordForm 이용폼입니다.---------------------

unit URecordForm;



interface



uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

ComCtrls, StdCtrls;



type

TRecordForm = class(TForm)

Label1: TLabel;

Label2: TLabel;

procedure FormClose(Sender: TObject; var Action: TCloseAction);



private

{ Private declarations }

public

{ Public declarations }

RecordForm: TRecordForm;

ParentApplication: TApplication;

end;



type



pDBRec = ^TDBRec;

TDBRec = record

aName, bName, cName:array[0..10] of char;

end;



var

DllApplication: TApplication;





implementation



{$R *.DFM}

procedure TRecordForm.FormClose(Sender: TObject; var Action: TCloseAction);

begin

RecordForm := nil;

Action := CaFree;

end;





//-----------------------------------------------------------------------

//---------------------------- main입니다.------------------------------

//선언부 생략

type

pDBRec = ^TDBRec;

TDBRec = record

aName, bName, cName:array[0..10] of char;

end;



type

TProc = procedure(AParentApplication: TApplication; ADBRec: pDBRec); stdcall;





//----------이부분입니다.

procedure TForm1.N5Click(Sender: TObject);

var

FDBRec: pDBRec;

RDBRec:TDBRec;

DLLHandle: THandle;

Proc: TProc;

begin



FDBRec^.aName := '000';

FDBRec^.bName := '111';

FDBRec^.cName := '222';



DLLHandle := LoadLibrary( 'dbmdc' );

if DLLHandle> 0 then

begin

Proc := GetProcAddress( DLLHandle, 'CreateChild' );

Proc(Application, FDBRec); -->요기서 에러 발생

end

else

Application.MessageBox('Not Found Dll','확인',48);

end;





end.

0  COMMENTS