就是在动态库里面的一个窗体中如何用MapX,我加进去之后,编译没有问题,但我一调用Dll的外部函数,就出错了。(这个函数负责显示Dll中地图的对话框。)
我是用Delphi+MapX开发的。
其实,我试过了,要是不加这个MapX的话就没有问题。
要是在应用程序中也没有问题。
这说明控件本身没有问题。
我想就是在DLL中没有初始化好控件。
希望大家帮帮小弟!
我是用Delphi+MapX开发的。
其实,我试过了,要是不加这个MapX的话就没有问题。
要是在应用程序中也没有问题。
这说明控件本身没有问题。
我想就是在DLL中没有初始化好控件。
希望大家帮帮小弟!
解决方案 »
- 关于在Form中如何关闭多个嵌套的tabsheet的问题
- 现金一百元
- FastReport 3.0的报表里数据字典的问题
- 没见过!!很惊讶!!
- 请教关于一个StringReplace函数的用法.
- 高分请教SCOKET问题!
- 急!!!请问有谁有东芝笔记本用的"Xircom cardbus ethernet 100 + modem56k"网卡的驱动程序啊?
- 在Delphi中怎么把字符转换成Ascii码?
- 请你终结在ASP中调用ActiveX的问题,为大伙谋一点福利吧,我只有这点分了,包涵
- 如何判断 CAPSLOCK,MUMLOCK等键 的状态
- 一个SMTP的问题,高手进,很有挑战性
- 如何在memo1中........
程序出错的地方:
Map1:=TMap.Create(nil);//就是这里出错了
Map1.Top:=50;
Map1.Left:=20;
Map1.ParentWindow:=self.Handle;
Map1.Update; 出错的信息是:
[Fatal Error] Could not create output file 'Info.dll'
还有我不动态建立的话,就是说从面版中放一个MapX控件到Dll中的窗体中的话,编译没有问题。但就是在导出函数中用显示这个函数时有问题了。
我的导出函数:
procedure ShowMapFrm(MainFrm:TForm);stdcall;
begin
if (MapF=nil) then
begin
MapF:=TMapFrm.Create(MainFrm);
MapF.mainF:=MainFrm;
end;
MapF.Show;
end;
我想出错的原因是因为MapX是基于COM技术的。在Dll中可能是没有对COM的初始化。
你们要是不信的话,你放一个ADOConnection也是一样的。
同样的错误。
那就加上CoInitialize/CoUnInitialize,每次组件调用加上可以,
总的线程加上也可以。
我调用就出错。
改为Map1 :=TMap.Create(调用这个DLL的主程序句柄)试一试了
接着找到TMap的InitControlData;方法,
把它修改成下面这样即可:
begin
CoInitialize(nil);
ControlData := @CControlData;
TControlData2(CControlData).FirstEventOfs := Cardinal(@@FOnError) - Cardinal(Self);
end;