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