unit MP_MAIN;
중략
...
uses
hMsg;
type
TResGetImage = procedure (ImgName: string; Sender: TObject); stdcall;
중략..
procedure TfrmMP_MAIN.FormCreate(Sender: TObject);
var
ResGetImage: TResGetImage;
CurrInst: THandle;
FarPtr: TFarProc;
begin
CurrInst := LoadLibrary('RESOURCE.DLL');
if(CurrInst > 0) then
begin
try
FarPtr := GetProcAddress(CurrInst, 'GetImage');
if(FarPtr <> nil) then
begin
ResGetImage := FarPtr;
ResGetImage('imgPIC1', Image1);
// Image1.Picture.Assign(ResGetImage('imgPIC1'));
// Image1.Picture.Assign(Image4.Picture );
// Image2.Assign(ResGetImage('imgPIC2'));
// Image3.Assign(ResGetImage('imgPIC3'));
end;
finally
FreeLibrary(CurrInst);
end;
end
else hMessageDlg('"RESOURCE.DLL" 파일이 존재하지 않습니다', mtError, [mbOk], 0);
end;
위에꺼는 DLL을 호출하는 쪽
아래꺼는 해당 DLL..
library RESOURCE;
uses
Forms, Classes, Graphics, Dialogs,
RESOURCE1 in 'RESOURCE1.pas' {frmIMAGES};
{$R *.RES}
procedure GetImage(ImgName: string; Sender: TPicture); stdcall;
var
frmIMAGES: TfrmIMAGES;
begin
Application.CreateForm(TfrmIMAGES, frmIMAGES);
try
ShowMessage(TImage(Sender).Name); // <-- 에러 안남 'Image1' 이라고 show폼에 정상적으로 출력됨
TImage(Sender).Picture.Assign(frmIMAGES.imgPIC1.Picture); // <--- 에러남
TImage(Sender).Picture.LoadFromFile('aa.jpg'); // <--- 에러남
finally;
frmIMAGES.Free;
end;
end;
exports
GetImage;
end.
-------------------------------------------------------------------------------------
질문내용은요 다름이 아니구..
DLL쪽에서 TImage 형태를 Argument로 넘겨 받은후
이것을 단순히 프로퍼티부분만 참조하면 error(Memory Access Violation) 가 나지 않으나
메소드를 참조하면 여지없이 나는군요
머 뾰족한 방법이 없을까요?
구현을 하고자 하는 내용은..,
프로그램에서 사용되는 이미지들을 DLL 폼내에 Timage들을 사용하여 저장시킨후
필요로하는 main 프로그램에서.. 이 dll을 호출한후.. 이것을 main 프로그램의 image 컨트롤에 복사시킬려고
하거든요.
그런데 잘 되지 않네요..
DLL 처리부분의 Argument도 Pic: TPicture, Img: TImage,
Sender: TObject 형으로 변경해 가면서 해도 잘 안되네요..
여러분 들의 조언을 부탁합니다.
DLL에서 파라매터나 리턴값으로 string을 사용하시면 메모리 관리에 문제가 생깁니다. DLL 프로젝트 만드시면 주석으로 10여줄의 설명이 나오는데 바로 이 문제에 관한 것입니다..
파라매터로 string형을 쓰시는 대신에 PChar형을 쓰세요...
^^ 항상 즐코하세요...