我用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;
}
帮帮忙啊!!!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;
}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货