Q&A

  • 폼에 똑 같은 dll 두개를 삽입했을 때


위 그림처럼 똑 같은 dll 을 삽입했습니다..

DLL 삽입  을 누루고

데이타입력 버튼을 눌러서 두 화면에 값을 넣고 싶은데..

데이타입력 버튼을 누르면 나중에 삽입한 DLL삽입 2 에만 값이 들어갑니다...

DLL삽입 1 에도 값이 들어가게 할수는 없나요 ?

아래는 소스 내용입니다..
===================================================================================
Dll source
===================================================================================

// Dll 삽입
procedure ShowTestDlg(App:TApplication; Parent:TWinControl) ; export;
begin
   Application := App;
   frmMain := TfrmMain.Create(App);
   frmMain.BorderStyle := bsNone;
   frmMain.Align  := alClient;
   frmMain.Parent := Parent;
   frmMain.Show;
end;

// 데이타입력
procedure strInfo(gubun:String); export;
begin
   frmMain.Edit1.Text := gubun ;
end;

exports
   ShowTestDlg, strInfo ;

===================================================================================
Exe source
===================================================================================

var
  Form1: TForm1;
  iDllHandle, iDllHandle2 : integer;  // Dll 핸들 변수

implementation

// Dll 삽입
procedure TForm1.Button4Click(Sender: TObject);
var
   DllFunc, DllFunc2 : procedure (App:TApplication; Parent:TWinControl);
begin
    iDllHandle  := LoadLibrary('test_01.DLL');
    iDllHandle2 := LoadLibrary('test_01.DLL');

    if iDllHandle >= 32 then begin
       @DllFunc := GetProcAddress(iDllHandle, 'ShowTestDlg');
       if @DllFunc <> Nil then
          DllFunc(Application, Panel1);
    end;

    if iDllHandle2 >= 32 then begin
       @DllFunc2 := GetProcAddress(iDllHandle2, 'ShowTestDlg');
       if @DllFunc2 <> Nil then
          DllFunc(Application, Panel2);
    end;

end;

// 데이타 입력
procedure TForm1.Button1Click(Sender: TObject);
var   DllVal, DllVal2 : procedure (gubun:string);
begin

    if iDllHandle >= 32 then begin
       @DllVal := GetProcAddress(iDllHandle, 'strInfo');
       if @DllVal <> Nil then
          DllVal('01');
    end;

    if iDllHandle2 >= 32 then begin
       @DllVal2 := GetProcAddress(iDllHandle2, 'strInfo');
       if @DllVal2 <> Nil then
          DllVal2('02');
    end;

end;
6  COMMENTS
  • Profile
    이정욱 2008.07.11 22:53
    private 에 Mainfrm : TfrmMain; 이라고 메인 폼 변수를 선언하시고,


    procedure ShowTestDlg(App:TApplication; Parent:TWinControl) ; export;
    begin
    Application := App;
    Mainfrm := TfrmMain.Create(App);
    Mainfrm.BorderStyle := bsNone;
    Mainfrm.Align := alClient;
    Mainfrm.Parent := Parent;
    Mainfrm.Show;
    end;

    procedure strInfo(gubun:String); export;
    begin
    if Assigned(Mainfrm) then
    Mainfrm.Edit1.Text := gubun ;
    end;


    이렇게 해도 마찬가지 결과가 나오나요? ^^;
  • Profile
    김상진 2008.07.11 22:56
    마찬가지 결과가 나옵니당 ^^
  • Profile
    이정욱 2008.07.11 23:05
    아.. 그렇군요. 이런형식은 한번도 해보질 못해봤었네요..

    혹시 소스 있으시면 올려주세요 ^^;
  • Profile
    김상진 2008.07.11 23:10
    위에 소스 있는데요 ㅠㅠ
  • Profile
    장성호 2008.07.12 00:42

    음...


    LoadLibrary로 같은 dll을 두번하나 열번 load하나 결과는 같은놈입니다.

    LoadLibrary후에 iDllHandle, iDllHandle2 을 비교해 보십시요 값이 같을것입니다.



    procedure TForm1.Button5Click(Sender: TObject);
    var
    h1,h2: THandle;
    begin

    h1:=LoadLibrary('user32.dll');
    h2:=GetModuleHandle('user32.dll');
    if(h1=h2) then
    ShowMessage('Loadlibrary 와 GetModuleHandle 의 결과는 같은놈이다. ');

    end;



    위 코드에서 h1과 h2도 같은놈이죠

    즉 님의 코드에서는 dll 안에 frmMain 은 하나밖에 없습니다.

    즉 ShowTestDlg이 두번째 호출될때는 같은데 덮어쓴 결과이죠

    아래와 같이 바꾸면 해결됩니다.


    Dll은

    //form을 생성한후 결과를 return해줍니다.


    function ShowTestDlg2(App:TApplication; Parent:TWinControl): TForm ; export;
    begin
    Application := App;
    Result := TfrmMain.Create(App);
    Result.BorderStyle := bsNone;
    Result.Align := alClient;
    Result.Parent := Parent;
    Result.Show;

    end;


    // 데이타입력할때 form을 받아서 TfrmMain으로 변환해 Edit에 입력해줍니다.
    procedure strInfo2(frm: TForm;gubun:String); export;
    begin
    TfrmMain(frm).Edit1.Text:=gubun;
    end;





    그리고 exe 의 소스는?




    var
    Frm1,Frm2: TForm;

    procedure TForm1.Button3Click(Sender: TObject);
    var
    DllFunc : function (App:TApplication; Parent:TWinControl):TForm;
    begin
    iDllHandle := LoadLibrary('test_01.DLL');

    if iDllHandle >= 32 then begin
    @DllFunc := GetProcAddress(iDllHandle, 'ShowTestDlg2');
    if @DllFunc <> Nil then
    begin
    frm1:=DllFunc(Application, Panel1);
    frm2:=DllFunc(Application, Panel2);

    end;
    end;
    end;


    procedure TForm1.Button4Click(Sender: TObject);
    var DllVal : procedure (frm:TForm;gubun:string);
    begin
    if iDllHandle >= 32 then begin
    @DllVal := GetProcAddress(iDllHandle, 'strInfo2');
    if @DllVal <> Nil then
    begin
    if Assigned(Frm1) thenDllVal(Frm1,'01');
    if Assigned(Frm2) then DllVal(Frm2,'02');
    end;
    end;
    end;



    위와같이 'ShowTestDlg2' 호출한후 결과를 따로 변수에 담아 뒀다가
    'strInfo2' 호출할때 그 Form을 파라메터로 넘겨줍니다.

    그럼..


  • Profile
    김상진 2008.07.12 01:44
    속이 시원하니 잘 됩니다.. 감사합니다...
    • steps
      2008.07.18 04:52
      procedure TForm1.btn1Click(Sender: TObject); var yr, mn, dy, i, days : word; function getDaysO...
    • 따따부따
      2008.07.18 20:24
      정말 감사합니다. ㅜㅜ
    • 따따부따
      2008.07.21 20:04
      위 내용대로 프로그램을 만들고 델파이7 에서 기본적으로 지원하는 WeekOfTheYear(Now) 를 써서 프로그...
    • steps
      2008.07.21 22:20
      델파이에서 주는 값은 요일을 고려한 역서의 주차입니다. 제가 올린 코드에서 DecodeDate를 DecodeDateF...
    • Crazy™
      2008.07.25 00:22
      주차를 구하는 방식이 몇가지 있는데요. 델파이 컴퍼넌트중 datetTimePicker ?든가. 달력보는 컴퍼넌트...
    • 방석배
    • 2008.07.18 02:46
    • 0 COMMENTS
    • /
    • 0 LIKES
    • steps
      2008.07.18 02:57
      function MyDLL(p_Port: Integer; p_InStr:PChar; var p_OutStr:PChar):integer; cdecl; 로 해보시죠.
    • 강신구
      2008.07.18 03:05
      이미 stdcall -> cdecl 로 바꿔봤는데 안되던군요..
    • 최용일
      2008.07.18 08:00
      참조에 의한 호출이니까 아래와 같이 주소를 넘겨줘야 될 것 같은데요... int rc = MyDLL(input_port, ...
    • 최용일
      2008.07.18 08:04
      TCP통신을 하셔야 할것 같네요... 양쪽에 모두 TCP통신을 하는 프로그램이 있어야 하고, 한쪽은 서버역...
    • 김성욱
      2008.07.19 04:12
      자료실에 보시면 한델 2차 세미나 자료있습니다. 소스 보시면 금방 해결 할 수 있습니다. 참고하...
    • 미소나눔
      2008.08.01 23:55
      저희도 회사에서 공지사항을 전파하기위해 비슷한걸 만든적이 있는데.. 뭐 대충 참고하세용.. // ...
    • 전문성
    • 2008.07.16 19:54
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 이정욱
      2008.07.17 10:25
      프로그램내에 자신의 어플리케이션 이름을 가지고 무엇인가 하는 부분이 있다면..확인해보세요.. 그런...
    • 임형호
      2008.07.16 02:52
      post 해보세요.
    • 석주현
      2008.07.16 06:46
      혹시 USB 드라이브나 외장하드 붙여서 작업하시다가 빼신게 아닌지 궁금하네요. 그럴경우 프로젝트가 ...
    • 가르쳐주삼
      2008.07.16 19:43
      계속 델파이 설치 CD 를 넣고 사용해야 되나요......?
    • 석주현
      2008.07.17 03:30
      아 그게 아니고요. 혹시 프로젝트 파일 중에 E 드라이브에서 읽어온 파일이 있나 없나 확인을 해보세...
    • 가르쳐주삼
      2008.07.18 20:50
      아~ 네~ 확인해보겠습니다.
    • 강정구
    • 2008.07.15 20:50
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 임형호
      2008.07.16 02:59
      일단 footer를 먼저 만드셔야돼요. RealGrid.Footers.Add; 이렇게하면 footer가 만들어지죠. 그후...
    • 장종운
    • 2008.07.15 19:23
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 이윤도
      2008.07.16 18:30
      네~ 가능한걸로 알고있구요. http://fadelphikorea.com/index.html <-- 델파이 FA개발자들을 위한...
    • 석주현
      2008.07.12 16:10
      http://www.codegear.com/downloads/regusers/delphi 등록 유저면 여기서 다운 가능 합니다. Quick...
    • 황경수
    • 2008.07.12 01:09
    • 5 COMMENTS
    • /
    • 0 LIKES
    • 장성호
      2008.07.12 01:21
      SysUtils.ShortDateFormat 을 바꾸지 말고 DateTimePicker의 Format을 바꿰세요 procedure TF...
    • 황경수
      2008.07.14 20:00
      장성호님 답변 감사 합니다. 그런데, 제가 질문을 잘못 한거 같네요. 지금 제가 만든 프로그램은 ...
    • 최용일
      2008.07.14 21:16
      간단하게 하세요... 디비에 넣을때 아마도 문자열로 넣으시는것 같은데... FormatDateTime을 써서 포맷...
    • 장성호
      2008.07.14 21:29
      프로그램내에서 무조건 항국어방식 '(YYYY-MM-DD)' 으로 처리하는게 목적이시라면? 님께서 질문하시기...
    • 황경수
      2008.07.17 19:07
      아... 제가 뭔가 실수 했었네요. 잘 돌아 가네요. 장성호님, 최용일님 정말 감사 드립니다. 그럼 좋은...
    • 김상진
    • 2008.07.11 21:52
    • 6 COMMENTS
    • /
    • 0 LIKES
    • 이정욱
      2008.07.11 22:53
      private 에 Mainfrm : TfrmMain; 이라고 메인 폼 변수를 선언하시고, procedure ShowTestDlg(App:TA...
    • 김상진
      2008.07.11 22:56
      마찬가지 결과가 나옵니당 ^^
    • 이정욱
      2008.07.11 23:05
      아.. 그렇군요. 이런형식은 한번도 해보질 못해봤었네요.. 혹시 소스 있으시면 올려주세요 ^^;
    • 김상진
      2008.07.11 23:10
      위에 소스 있는데요 ㅠㅠ
    • 장성호
      2008.07.12 00:42
      음... LoadLibrary로 같은 dll을 두번하나 열번 load하나 결과는 같은놈입니다. LoadLibrary후...
    • 김상진
      2008.07.12 01:44
      속이 시원하니 잘 됩니다.. 감사합니다...
    • 이우석
    • 2008.07.11 20:50
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 이정욱
      2008.07.11 21:30
      델파이 개발 환경 내에서 나는 익셉션이라면 정상입니다. 인디에서는 파일이 존재 한다면 위의 익셉션...
    • 사다리
      2008.11.19 08:43
      FTP.Get(s, SaveFile.FileName, True, FTP.ResumeSupported); 요 구문에서요 세번째 파라미터 값이...
    • 석주현
      2008.07.11 18:42
      <!--CodeS--> procedure TMainForm.tmr1Timer(Sender: TObject); begin Label1.Caption := Ti...
    • 김용호
      2008.07.11 18:48
      답변 감사합니다. 그런데 그것도 역시 안되네요.. ㅎㅎ 혹시 다른 방법은 ..... 감사합니다.. ...
    • 석주현
      2008.07.11 18:49
      7.0 에서는 잘되는 데 이상하군요 ㅠ_ㅠ
    • 김용호
      2008.07.11 18:54
      감사합니다.. 아무래도 6.0에선 안되는 듯하니 버젼을 올려서 해봐야 겠어요.. 답변 정말로 감사합니...
    • 김용호
      2008.07.11 19:16
      2007로 해보니 그냥은 안되고 알려주신 코드를 추가하니 되긴하네요. 다시 그려서 그런가 화면이 약간 ...
    • 이정욱
      2008.07.11 21:27
      Label1.Caption := TimeToStr(Now); Label1.Update; 를 해보세요. 참.. 그리고, 폼 OnCreate 에...
    • 장성호
      2008.07.11 21:29
      Label은 Graphic 컨트롤입니다. 무슨 말이냐면 자신을 나타낼 핸들이 없기때문에 Parent의 DC에 자...
    • • • •