我在BCB里写了一个简单的窗体而后封装成DLL,由DELPHI调用,在DELPHI的MAINMENU中将BCB 的窗体调用出来,但是我将它设置为子窗体就报错
Cannot create form.No MDI forms are currently active.都快崩溃了,不知道该怎么办啦~~大家帮帮忙~!
BCB中的代码:
USERES("cheshi1.res");
USEFORM("csForm1.cpp", cForm1);
TcForm1* DllMyForm;
extern "C" __declspec(dllexport) __stdcall void CreateFromFunct();
//---------------------------------------------------------------------------#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*)
{
  return 1;
}
//---------------------------------------------------------------------------void __stdcall CreateFromFunct()
{
  DllMyForm = new TcForm1(Application);
  DllMyForm->FormStyle = fsMDIChild;
  DllMyForm->Show();
}
//---------------------------------------------------------------------------DELPHI中的调用
implementation
  procedure CreateFromFunct(); stdcall external 'dll1\ceshi1.dll';{$R *.DFM}procedure TYourForm.N21Click(Sender: TObject);
begin
  CreateFromFunct();
end;

解决方案 »

  1.   

    CreateFromFunct需要传入调用程序的Application句柄 void __stdcall CreateFromFunct(HWND hApp)
    {
      Application->Handle=hApp;
      DllMyForm = new TcForm1(Application);
      DllMyForm->FormStyle = fsMDIChild;
      DllMyForm->Show();
    }
      

  2.   

    那在DELPHI这边的调用该怎么写呢??小弟很菜~望高手赐教~!
      

  3.   

    我现在是这样写的
    implementation
      procedure CreateFromFunct(); stdcall external 'dll1\ceshi1.dll';
    {$R *.DFM}procedure TYourForm.N21Click(Sender: TObject);
    begin
      CreateFromFunct(Application.handle);
    end;但是报错:Too many actual parameters.......
      

  4.   

    implementation
      procedure CreateFromFunct(HWND hApp); stdcall external 'dll1\ceshi1.dll'; //这里
    {$R *.DFM}procedure TYourForm.N21Click(Sender: TObject);
    begin
      CreateFromFunct(Application.handle);
    end;当然Dll的接口和创建Form的函数也得改
      

  5.   

    谢谢LS的大哥~~但是现在还是报错:Missing parameter type Not enough actual parametersBCB:
    USERES("cheshi1.res");
    USEFORM("csForm1.cpp", cForm1);
    TcForm1* DllMyForm;
    extern "C" __declspec(dllexport) __stdcall void CreateFromFunct();
    //---------------------------------------------------------------------------#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(HWND hApp); stdcall external 'dll1\ceshi1.dll';
      procedure CreateFromFunct1(); stdcall external 'dll2\cheshi2.dll';
    {$R *.DFM}procedure TYourForm.N21Click(Sender: TObject);
    begin
      CreateFromFunct(Application.handle);
    end;OTZ~~~OTZ~~~OTZ
      

  6.   

    procedure CreateFromFunct(hApp:THandle); stdcall external 'dll1\ceshi1.dll';
      

  7.   

    这样写,的确编译是通过了,但在运行时报错:无法定位程序输入点......
    void __stdcall CreateFromFunct(HWND hApp)
    {
      Application->Handle = hApp;
      DllMyForm = new TcForm1(Application);
      DllMyForm->FormStyle = fsMDIChild;
      DllMyForm->Show();
    }
    是不是这里还有问题呢???
      

  8.   

    CB都忘的差不多了,MDI窗口还要主窗口的实例.给你一个Delphi的例子:DLL:library Project1;{ Important note about DLL memory management: ShareMem must be the
      first unit in your library's USES clause AND your project's (select
      Project-View Source) USES clause if your DLL exports any procedures or
      functions that pass strings as parameters or function results. This
      applies to all strings passed to and from your DLL--even those that
      are nested in records and classes. ShareMem is the interface unit to
      the BORLNDMM.DLL shared memory manager, which must be deployed along
      with your DLL. To avoid using BORLNDMM.DLL, pass string information
      using PChar or ShortString parameters. }uses
       SysUtils,
       Classes,
       Forms,
       Dialogs,
       Unit1 in 'Unit1.pas' {Form1};{$R *.res}procedure CreateFromFunct(AppRes, MainRes: LongInt); stdcall;
    begin
       Application := TApplication(AppRes); //类型强制转换
       Form1 := TForm1.Create(TForm(MainRes));
       Form1.FormStyle := fsMDIChild;
       Form1.Show();
    end;exports CreateFromFunct;begin
    end.//MDI主窗口var
       Form1: TForm1;implementationprocedure CreateFromFunct(AppRes,MainRes: LongInt); stdcall external 'Project1.dll';{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    begin
       CreateFromFunct(LongInt(Application), LongInt(Form1));
    end;