2011-03-22 2 views
1

을 포함하고 있습니다. 그럼에도 불구하고 이것은 불완전한 질문이지만, 그럼에도 불구하고 ...
델파이의 플러그인에 대해 몇 가지 질문을했습니다. 무엇이 더 좋은 방법은 DLL을, bpl, OCX, 스크립팅 엔진 ...
나는 모든 * .bpls 및 모든 종속성을 배포하고 싶지 않아 ...
내가 필요로하는 * .dll은 TForm . 그리고 그 양식은 호스트 응용 프로그램에 배치해야합니다. delphi에서 직접 지원하지 않습니다 (매우 슬픈 상황). 몇 가지 해결 방법이 있지만 탭 키 등의 문제가 있습니다.
해결 방법이 완벽하지 않습니다.
하지만 다른 가능성이있을 수 있습니다. dll 코드를 직접 호스트 * .exe에 삽입하십시오. 그래서 * .exe는 주입 된 코드가 자신의 것으로 생각할 것입니다. 그리고 많은 문제 (예 : Tab 키가있는 형태)가 없어야합니다. 가능합니까? 그것은 더러운 해킹이 아닙니다. 그 기술은 "프로그램 적으로"합법적입니까?
(I 코드 주입과 경험이없고, 어쩌면 내가 여기 무슨 말인지 sence가되지 않습니다)

안부
베드로가

[편집]
는 몇 가지를 명확히하기 위해 ... TForm을 dll에 넣었을 때 호스트 * .exe 응용 프로그램에이 형식을 포함 시키려고 시도 할 때 많은 문제가 발생합니다. 우선 "TFont에 TFont를 할당 할 수 없습니다"라는 오류가 있지만 이에 대한 해결 방법이 있습니다.
두 번째로 호스트 응용 프로그램은 전체 포함 된 양식을 하나의 구성 요소로 사용하므로 탭 키를 사용할 수 없습니다. (탭을 누르면 포커스가 임베디드 형식에서 완전히 뛰어납니다.) 또한 우리는 이것에 대한 몇 가지 해결 방법을 가지고 있지만 완벽하지는 않습니다 ...
그래서 우리는 호스트에 코드를 삽입하면 어쩌면 호스트가 자신의 코드 인 emebeded form을 생각할 것입니다. 키가 작동합니다.
하지만 전에 말했듯이, 주입에 대해서는 전혀 모른다. 단지 미친 아이디어 일 것이다.)삽입 된 dll 코드를 델파이 * .dll 플러그인으로 사용하십시오. TForm

+0

완벽하게 동작하는 VCL 폼을 보여주는 DLL을 만드는 것은 아무런 문제가되지 않습니다. 내가 사용할 표준 예제는 Office COM 추가 기능입니다. Add-in Express를 사용하여 작성된 것 중 하나가 있습니다. 그것은 대접을합니다. 당신의 문제는 다른 곳에 있으며 당신은 어디에서나 아무 것도 주입 할 필요가 없습니다! –

+0

이 질문은 너무 열려 있습니다. 문제의 특정 문제를 해결하면 더 좋습니다. 예를 들어, 주입 코드를 exe_think_로 만들어서 해결되는 것은 자체 코드입니다. AFAIK, 델파이 응용 프로그램에서 dll에서 오는 양식을 사용하는 일반화 된 탭 문제는 없으며 DLL에 포함 된 양식이 다른 개체와 다를 수 있으므로이 방법으로이 문제를 해결할 수있는 방법을 실제로 볼 수 없습니다. 호스트 응용 프로그램의 전역 객체. 귀하의 말로하면, 문제는 dll 코드 자체에 대한 _thinks_, 그리고 dll에 대해 exe가 생각하는 것이 아닙니다. – jachguate

답변

1

설명하는 해킹이 없으면 완벽하게 가능하다. 예 :

library FormDLL; 

uses 
    Windows, 
    Forms, 
    uMyForm in 'uMyForm.pas' {MyForm}; 

procedure ShowForm(MainFormHandle: HWND); stdcall; 
begin 
    Application.Handle := MainFormHandle; 
    with TMyForm.Create(nil) do begin 
    ShowModal; 
    Free; 
    end; 
end; 

exports 
    ShowForm; 

begin 
end. 

TMyForm에는 원하는 것을 넣을 수 있습니다. 반대편에 델파이 응용 프로그램을 만들고 다음 코드를 추가하여 DLL을 호출하십시오.

procedure ShowForm(MainFormHandle: HWND); stdcall; external 'FormDLL.dll'; 

procedure TMainForm.Button1Click(Sender: TObject); 
begin 
    ShowForm(Handle); 
end; 

이것은 완벽하게 동작합니다.

그래서, 귀하의 문제가 무엇인지 분명하지 않습니다. 자세한 내용을 제공 할 수 있으면 그렇게하십시오.

+0

맞습니다만 어떤 상황에서는 양식이 나타나지 않고 ShowModal을 별도의 스레드에서 호출해야합니다 ...나는 응용 프로그램을 만들었습니다. yahoomessenger가 dmall을로드하도록로드했을 때 나는 showmodal을 호출했을 때 즉시 폼이 사라져서 CreateThread를 사용 했으므로 세부 사항을 알지 못해서 그것에 대해 논평하기는 어려웠습니다. – opc0de

+0

@ opc0de "Y! messanger를 강제로로드하여 DLL을로드하라"고 말할 때 협력 시스템을 사용합니다. –

+0

예, 코드는 완벽하지만 SHOWMODAL이 있습니다. 하지만 dll에서 호스트하기위한 형식을 포함해야하는 경우에는 어떻게해야할까요? (제 [편집]] 참조) – Peter