就是在动态库里面的一个窗体中如何用MapX,我加进去之后,编译没有问题,但我一调用Dll的外部函数,就出错了。(这个函数负责显示Dll中地图的对话框。) 
我是用Delphi+MapX开发的。  
其实,我试过了,要是不加这个MapX的话就没有问题。 
要是在应用程序中也没有问题。 
这说明控件本身没有问题。 
我想就是在DLL中没有初始化好控件。 
希望大家帮帮小弟! 

解决方案 »

  1.   

    我想主要是没有初始化! 
    程序出错的地方: 
      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也是一样的。 
    同样的错误。
      

  2.   

    我没有用过MAPX。。如果是没有初始化COM的话,
    那就加上CoInitialize/CoUnInitialize,每次组件调用加上可以,
    总的线程加上也可以。
      

  3.   

    但就是在DLL中没有啊。
    我调用就出错。
      

  4.   

    没有用过MapX,你只能试一试把Map1:=TMap.Create(nil);//就是这里出错了
    改为Map1 :=TMap.Create(调用这个DLL的主程序句柄)试一试了
      

  5.   

    DLL里面没有难道你就不能在主调它的函数加上吗?
      

  6.   

    在ImportS目录下找到MapLib_TLb.pas文件,
    接着找到TMap的InitControlData;方法,
    把它修改成下面这样即可:
    begin
      CoInitialize(nil);
      ControlData := @CControlData;
      TControlData2(CControlData).FirstEventOfs := Cardinal(@@FOnError) - Cardinal(Self);
    end;