我在写COM的时候碰到这样一个问题。
regsvr32注册COM控件的时候,提示注册成功,点击确定按钮后,出现非法的地址访问错误。
考虑,可能是GUID的问题。修改该COM的GUID后,没有出现该问题,但是过了一天后,问题再次出现。然后再怎么修改GUID,还是有问题。(代码没有动过,不知道怎么回事。)
考虑,可能是代码的问题。重新生成一个COM,再一个一个的增加函数验证。发现,只要在COM类中增加了窗体创建(Form.Create)函数后,立即出现该错误。那位高手告知原理,同时提供解决方法。
PS:我在COM类中使用窗体创建函数,是因为我需要用到自动化事件。

解决方案 »

  1.   

    你要明白Com在分布式开发中属于中间层,是处理表现层与数据层的桥梁
    主要是处理业务逻辑的,安装COM+的机器是应用服务器,其中的服务都是
    不可视控件呀,不过COM+就是一个DLL,你用DLL封装From 然后再调用你用过没?
    首先你在DLL中必须要先注册你用使用的Form ,你注册了COM+但是你的COM+中也
    要注册你要用到的Form类呀
      

  2.   

    感谢楼上的讲解。
    我的问题出在:
    procedure TSurat.Initialize;
    begin
        inherited Initialize;
        FConnectionPoints:=TConnectionPoints.Create(Self);
        if AutoFactory.EventTypeInfo<>nil then
            FConnectionPoint:=FConnectionPoints.CreateConnectionPoint(
                AutoFactory.EventIID,ckSingle,EventConnect)
        else
            FConnectionPoint:=nil;    begin
            FrmMain:=TFrmMain.Create(Application);
            FrmMain.SendSMSToRoof:=SMSToRoof;
            FrmMain.NoteMark:=NoteMark;
        end;
    end;
    中的FrmMain:=TFrmMain.Create(Application);
    如何解决?
      

  3.   

    你可以设regsvr32.EXE 为HOST APPLICATION.来跟踪调试一下,看看到底发生了什么.regsvr32.exe XXX.DLL  这样注册,其实是调用这个DLL的DllRegisterServer,
    你在它那儿设置断点,就可以一步步看了.
      

  4.   

    把COM当作中间层平台支持的时候,是绝不要去在里面加入FORM这样的东西..
    如果仅是把COM当作编程技术,请便...就把它看作一般的DLL差不多吧,只要你能
    理解它本质,能够驾驭它..那...随你怎么.
      

  5.   

    感谢halfdream(哈欠) 的回复。
    用regsvr32做为Host Application调试,系统没有进入我在exports中的DllRegisterServer前已经提示注册成功,然后出现一个地址是00000000的读取错误。
    从系统层面理解,Regsvr32程序是运行在受到保护的内存区域的,应该是没有可能让第三方程序进入调试,不知道你是怎么调试的。
    同时,在COM中加入Form并没有导致我的使用错误。只是注册错误而已。其中道理何在?
      

  6.   

    你的DLL编译的时候,要加入调试信息的.你也可以不用regsvr32作为HOST,
    你自己在一个EXE中,LoadLibrary ,然后调用DllRegisterServer另外,你在调试的时候,先把这个DLL注销一下.