还是子窗口调用的问题~~再搞不出来死的心都有了0(_ _)0

ddo123 2007-03-09 02:23:50
BCB中建立窗体然后封装为DLL,使用DELPHI调用,要求调用的BCB 窗体要以子窗体显示.做的要疯掉了....一直报这个错:Cannot create form.No MDI forms are currently active.
BCB:
USERES("cheshi1.res");
USEFORM("csForm1.cpp", cForm1);
TcForm1* DllMyForm;
extern "C" __declspec(dllexport) void __stdcall CreateFromFunct(HWND hApp);
//---------------------------------------------------------------------------

#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*)
{
return 1;
}
//---------------------------------------------------------------------------

void __stdcall CreateFromFunct(HWND hApp)
{
Application->Handle = hApp;
DllMyForm = new TcForm1(Application);
DllMyForm->FormStyle = fsMDIChild;
DllMyForm->Show();
}
//-----------------------------------------------------------------------

DELPHI的调用:
implementation
procedure CreateFromFunct(hApp:HWND); stdcall external 'dll1\ceshi1.dll';

{$R *.DFM}

procedure TYourForm.N21Click(Sender: TObject);
begin
CreateFromFunct(Application.Handle);
end;

是不是在BCB里面不能用Application->Hadle这样是不是正确?
不知道这里面还有什么问题,就那么点分了....请大家帮忙看看,我在这里谢谢大家了.
...全文
378 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
laowang2 2007-03-18
  • 打赏
  • 举报
回复
对于DLL,即使你可以调用DLL里的MDI窗体,子窗体的键盘也会失去响应,一般是把MDI封装在bpl里。
ddo123 2007-03-13
  • 打赏
  • 举报
回复
.....能有BCB的例子就好了....偶很菜...不会把楼上的DELPHI 转成BCB :(
句柄搞了半天还是不行,所以我换了个方法写
BCB(DLL):
USERES("cheshi3.res");
USEFORM("csForm3.cpp", cForm3);
TcForm3* DllMyForm2;
TApplication *SaveA = NULL;

extern "C" __declspec(dllexport) __stdcall void CreateFromFunct2(TApplication* mainApp);
//---------------------------------------------------------------------------

#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*)
{
if ( (reason==DLL_PROCESS_DETACH) && SaveA)
Application = SaveA ;
return 1;
}
//---------------------------------------------------------------------------

void __stdcall CreateFromFunct2(TApplication* mainApp)
{
if (NULL == SaveA)
{
SaveA = Application;
Application = mainApp;
}

DllMyForm2 = new TcForm3(Application);
DllMyForm2->FormStyle = fsMDIChild;
DllMyForm2->Show();
}
//---------------------------------------------------------------------------


DELPHI:
implementation
procedure CreateFromFunct2(mainApp:TApplication); stdcall external 'dll3\cheshi3.dll';
{$R *.DFM}

procedure TYourForm.N32Click(Sender: TObject);
begin
CreateFromFunct2(Application);
end;

end.

但是调用后,报错,我不知道这个方法能实现不?如果能我哪写的有问题?希望各位高手帮忙看看~谢谢了
勉励前行 2007-03-12
  • 打赏
  • 举报
回复
檢測一下:MainForm

Application->Handle = hApp;
if(!Application->MainForm || Application->MainForm->FormStyle != fsMDIForm)
throw Exception("not found MDI MainForm");

DllMyForm = new TcForm1(Application);
DllMyForm->FormStyle = fsMDIChild;
DllMyForm->Show();
zwh202342 2007-03-12
  • 打赏
  • 举报
回复
如果从dll里输出资源则编译的头文件顺序应用程序和dll要求一致,不然就会报错!
CACACACACA 2007-03-12
  • 打赏
  • 举报
回复
MainInstance := OldMainInstance;
HInstance := OldHInstance;

把这两个全局变量也传过来试试.
CACACACACA 2007-03-12
  • 打赏
  • 举报
回复
library ChildForm;

uses
SysUtils,
Classes,
Forms,
Windows,
SysInit,
Dialogs,
Unit_ChildForm in 'Unit_ChildForm.pas' {frmChildForm};

{$R *.res}
var
OldApp: TApplication;
OldScn: TScreen;
OldMainInstance: LongWord;
OldHInstance: LongWord;
SaveProc: TDLLProc;

procedure EntryPointProc(Reason: Integer);
begin
case Reason of
DLL_PROCESS_ATTACH:
begin
OldApp := Application;
OldScn := Screen;
OldMainInstance := MainInstance;
OldHInstance := HInstance;
end;
DLL_PROCESS_DETACH:
begin
Application := OldApp;
Screen := OldScn;
MainInstance := OldMainInstance;
HInstance := OldHInstance;
end;
end;
end;

procedure ShowChildForm(App: TApplication; Scr: TScreen; MainInst: LongWord; HInst: LongWord);
begin
Application := App;
Screen := Scr;
MainInstance := MainInst;
HInstance := HInst;
frmChildForm := TfrmChildForm.Create( Application );
frmChildForm.FormStyle := fsMDIChild;
frmChildForm.Visible := True;
end;

exports
ShowChildForm;

begin
SaveProc := DLLProc;
DllProc := @EntryPointProc;
EntryPointProc(DLL_PROCESS_ATTACH);
DLLProc := SaveProc;
end.
ddo123 2007-03-12
  • 打赏
  • 举报
回复
....用的是BCB 6.0。。。。。。而且几乎没有换的可能啊~~
sczyq 2007-03-12
  • 打赏
  • 举报
回复
应保证同一个编译器。推荐均使用 BCB2006
sczyq 2007-03-12
  • 打赏
  • 举报
回复
TApplication *SaveApp = NULL;
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*)
{
if ( (reason==DLL_PROCESS_DETACH) && SaveApp )

Application = SaveApp ;
return 1;
}

------------------------
在BDS2006中,根本不用这样了,只要:

int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*)
{
return 1;
}
ddo123 2007-03-12
  • 打赏
  • 举报
回复
如果要改回来的话,是不是要这样?
TApplication *SaveApp = NULL;
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*)
{
if ( (reason==DLL_PROCESS_DETACH) && SaveApp )

Application = SaveApp ;
return 1;
}
勉励前行 2007-03-12
  • 打赏
  • 举报
回复
你把 MainForm 傳到 DLL 中去
DLL:
Application->MainForm = MyMainForm ;
或者干脆替換:
Application = MyApplication ;

不過無論作了什麼改動,在退出DLL時記得要改回來。
ddo123 2007-03-12
  • 打赏
  • 举报
回复
这的确是正确的,但是将他用BCB 来实现就不行了...我也不知道为什么,根据PPower的测试方法发现not found MDI MainForm............
CACACACACA 2007-03-12
  • 打赏
  • 举报
回复
frmChildForm := TfrmChildForm.Create( Application ); 现在一Create,窗体就显示出来了.
CACACACACA 2007-03-12
  • 打赏
  • 举报
回复
procedure ShowChildForm(App: TApplication);
begin
Application := App;

上面这样就没问题了.

主要问题是: DllMyForm->FormStyle = fsMDIChild;
ddo123 2007-03-12
  • 打赏
  • 举报
回复
啊,的确是这样,检测下发现not found MDI MainForm~!!!!!现在该怎么办呢~~OTZ~!
ddo123 2007-03-11
  • 打赏
  • 举报
回复
谢谢LS 的....DELPHI 4过的确没什么问题..但是BCB还是不行总是报那个错...:(
CACACACACA 2007-03-10
  • 打赏
  • 举报
回复
动态调用搞不定了, 静态的没问题.
CACACACACA 2007-03-09
  • 打赏
  • 举报
回复
机器上没有BCB, 只好用DELPHI的了

效果没有问题, 只是显示的时间报个异常, 退出时不报异常.

你换成BCB代码试试吧.
CACACACACA 2007-03-09
  • 打赏
  • 举报
回复
library ChildForm;

uses
SysUtils,
Classes,
Forms,
Windows,
SysInit,
Dialogs,
Unit_ChildForm in 'Unit_ChildForm.pas' {frmChildForm};

{$R *.res}
var
OldApp :TApplication;
SaveProc: TDLLProc;

procedure EntryPointProc(Reason: Integer);
begin
if Reason = DLL_PROCESS_DETACH then
begin
Application := OldApp;
end;

if Reason = DLL_PROCESS_ATTACH then
begin
OldApp := Application;
end;
end;

procedure ShowChildForm(App: TApplication);
begin
Application := App;
frmChildForm := TfrmChildForm.Create( App );
frmChildForm.FormStyle := fsMDIChild;
frmChildForm.Visible := True; // !!! 不要用ShowModal !!!
end;

exports
ShowChildForm;

begin
SaveProc := DllProc;
DllProc := @EntryPointProc;
EntryPointProc(DLL_PROCESS_ATTACH);
DllProc := SaveProc;
end.

604

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder VCL组件使用和开发
社区管理员
  • VCL组件使用和开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧