Q&A

  • DLL에서는 피호출측에서넘겨받은 인자의 메소드를 참조 못하나요?
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 형으로 변경해 가면서 해도 잘 안되네요..


여러분 들의 조언을 부탁합니다.
2  COMMENTS
  • Profile
    최용일 2003.06.20 00:54
    안녕하세요. 최용일입니다.

    DLL에서 파라매터나 리턴값으로 string을 사용하시면 메모리 관리에 문제가 생깁니다. DLL 프로젝트 만드시면 주석으로 10여줄의 설명이 나오는데 바로 이 문제에 관한 것입니다..

    파라매터로  string형을 쓰시는 대신에 PChar형을 쓰세요...

    ^^ 항상 즐코하세요...

  • Profile
    박진수 2003.06.20 01:33
    답변 감사 합니다.  
    그러나 저도 그럴꺼 같아 그렇게도 해보았습니다..

    심지어는 이렇게도 해봐도 여전히 나는군요..

    일단 아래 소스에서 수정한 곳만 발췌 하죠

    main쪽 부분에

    type
        TResGetImage = procedure (Sender: TObject);  stdcall

    ..  중략

    호출부분의
                      ResGetImage('imgPIC1', Image1);    을
                      ResGetImage(Image1);   이렇게..
    수정했구요..

    DLL쪽의

    procedure GetImage(Sender: TPicture); stdcall;
    begin
    ...  중략
    end;

    이렇게 수정했습니다.
    결과요? 마찬가지 입니다...  흑흑흑

    최용일님...  우짜면 되죠..