我用Delphi7做的DLL为MDI子窗体,内含MAPX5GIS应用,要在BCB6下调用,结果是能正常调用和不能加载DLL的比例差不多,用Delphi7做的主程序来加载的话则一切OK,我想请教高手们,这是什么原因??谢谢!!!
帮帮忙啊!!!Delphi7中DLL主程序文件如下:library CfgGIS;{ 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,   //含TApplication和TForm单元
  Windows,
  Messages,//把MDIChild窗体关联的单元也包含过来
  ActiveX,
  Variants, Graphics, Controls,
  Dialogs, ImgList, Buttons, RzButton, ExtCtrls, RzPanel, OleCtrls,
  MapXLib_TLB, DB, ADODB,ComObj,
  MapMainFrm in 'MapMainFrm.pas' {MainFrm};
  
{$R *.res}var
  DllApp:TApplication; //暂存Dll的Application实例//DLL导出函数实现Begin
Procedure InvokeTestForm(app:TApplication);stdcall;export;
begin
  Application:=app;
  Application.CreateForm(TMainFrm,MainFrm);
  MainFrm.WindowState:=wsMaximized;
end;Procedure DllEnterPoint(Reason:DWORD);stdcall;//DLL出入口
begin
  if Reason=DLL_PROCESS_DETACH then  //进程退出时
  begin
    Application:=DllApp;
    CoUnInitialize;
  end;
end;exports
  InvokeTestForm;begin
{DLL初始化代码写于此处}
  DllApp:=Application;
  CoInitialize(nil);
  DLLProc:=@DllEnterPoint;
end.Delphi7中DLL的MDIChild窗体文件如下:unit MapMainFrm;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ImgList, Buttons, RzButton, ExtCtrls, RzPanel, OleCtrls,
  MapXLib_TLB, DB, ADODB,ComObj;type
  TMainFrm = class(TForm)
    RzToolbar1: TRzToolbar;
    RzToolbarButton1: TRzToolbarButton;
    RzToolbarButton2: TRzToolbarButton;
    RzToolbarButton3: TRzToolbarButton;
    RzToolbarButton4: TRzToolbarButton;
    Panel1: TPanel;
    Map1: TMap;
    RzButton1: TRzButton;
    ADOConnection1: TADOConnection;
    ADOQuery1: TADOQuery;
    procedure RzToolbarButton1Click(Sender: TObject);
    procedure RzToolbarButton2Click(Sender: TObject);
    procedure RzToolbarButton3Click(Sender: TObject);
    procedure RzToolbarButton4Click(Sender: TObject);
    procedure RzButton1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    MyDataSet:CMapXDataset;
  end;var
  MainFrm: TMainFrm;implementation{$R *.dfm}procedure TMainFrm.FormCreate(Sender: TObject);
begin
end;procedure TMainFrm.RzToolbarButton1Click(Sender: TObject);
begin
  MainFrm.Map1.CurrentTool:=miPanTool;
end;procedure TMainFrm.RzToolbarButton2Click(Sender: TObject);
begin
  MainFrm.Map1.CurrentTool:=miZoomInTool;
end;procedure TMainFrm.RzToolbarButton3Click(Sender: TObject);
begin
  MainFrm.Map1.CurrentTool:=miZoomOutTool;
end;procedure TMainFrm.RzToolbarButton4Click(Sender: TObject);
begin
  MainFrm.Map1.CurrentTool:=miSelectTool;
end;procedure TMainFrm.RzButton1Click(Sender: TObject);
begin
  try
    MainFrm.ADOConnection1.Connected:=True;
    MainFrm.ADOQuery1.SQL.Clear;
    MainFrm.ADOQuery1.SQL.Add('SELECT * FROM TEST');
    MainFrm.ADOQuery1.Active:=True;
    MainFrm.ADOQuery1.Open;
  except
    ShowMessage('数据库连接失败!');
  end;
  try
    MainFrm.MyDataSet:=MainFrm.Map1.DataSets.Add(miDataSetADO,MainFrm.ADOQuery1.Recordset,'MyDataset','PROVINCE_F',EmptyParam,MainFrm.Map1.Layers._Item('ProvinceCity'),EmptyParam,EmptyParam);
    //ShowMessage(MainFrm.MyDataSet.Name);
    MainFrm.MyDataSet.Themes.Add(EmptyParam,EmptyParam,EmptyParam,EmptyParam);
  except
    ShowMessage('数据绑定失败!');
  end;
end;end.
BCB6里主程序文件部分如下:
HMODULE dllHandle;
void __fastcall TParentForm::OpenButtonClick(TObject *Sender)
{
  void __stdcall (*InvokeTestForm)(TApplication *)=NULL;
  (FARPROC)InvokeTestForm=GetProcAddress(dllHandle,"InvokeTestForm");//获取要调用函数的指针
  if(InvokeTestForm)
  {
    InvokeTestForm(Application);//show 出DLL中MDI子窗体
    formOnOff=true;
    CloseButton->Enabled=true;
  }
  else
  {
    ShowMessage("调用DLL中函数失败!!");
  }
}void __fastcall TParentForm::FormCreate(TObject *Sender)
{
  dllHandle=LoadLibrary("CfgGIS.dll"); //加载DLLOK
  //dllHandle=LoadLibrary("NewCfgGIS.dll"); //加载DLL
  if(dllHandle==NULL)
  {
    ShowMessage("调用DLL失败!");
    return;
  }
}void __fastcall TParentForm::FormClose(TObject *Sender,
      TCloseAction &Action)
{
  if(CloseButton->Enabled)
      CloseButton->Click();//子窗口先于父窗口销毁    FreeLibrary(dllHandle);
    dllHandle = 0;    Action=caFree;        
}