library ProSummaryCom;uses
  ShareMem,
  ComServ,
  ReportSummary in 'ReportSummary.pas', //COM定义单元
  UReportSummary in 'UReportSummary.pas', //COM实现单元
  ProSummaryCom_TLB in 'ProSummaryCom_TLB.pas';exports
  DllGetClassObject,
  DllCanUnloadNow,
  DllRegisterServer,
  DllUnregisterServer;{$R *.TLB}{$R *.RES}beginend.是从TComObject继承的 TReportSummary=class(TComObject,IReportSummary)用regsvr32 注册时先出现注册成功:---------------------------
RegSvr32
---------------------------
F:\Delphi_Project\headpms_xj\pms_sg\source\Report\Summary\ProSummaryCom.dll 中的 DllRegisterServer 成功。
---------------------------
确定   
---------------------------确定后就出现一个错误:
---------------------------
regsvr32.exe - 应用程序错误
---------------------------
"0x00000000" 指令引用的 "0x00000000" 内存。该内存不能为 "written"。
要终止程序,请单击“确定”。
要调试程序,请单击“取消”。
---------------------------
确定   取消   
---------------------------卸载时也是同样的,成功了,但出现一个错误对话框.注册后可以正常使用,但什么原因引起的错误呢??如果自己加载了DLL文件,想得到它的 DllRegisterServer 方法.
hFunctionAddress := GetProcAddress(hLibraryhandle,PChar('DllRegisterServer'));hFunctionAddress 确总是nil ,为什么找不到 DllRegisterServer方法呢??

解决方案 »

  1.   

    这个比较麻烦,先将Regsvr32作为宿主程序调试一下看能否通过。不过这问题多数得由其他代码有问题引起的。
      

  2.   

    估计是那个DllRegisterServer方法里面的代码有问题吧
      

  3.   

    DllRegisterServer 就是ComServ单元的,没有做修改.
      

  4.   

    ReportSummary in 'ReportSummary.pas', //COM定义单元
      UReportSummary in 'UReportSummary.pas', //COM实现单元
      ProSummaryCom_TLB in 'ProSummaryCom_TLB.pas';
    这三个单元的
    initializationfinalization分别写了什么内容?检查下?
      

  5.   

    一般不会是DllRegisterServer函数问题。检查下其他代码的内存是否没释放
      

  6.   

    解决了,将DLL中引用的Forms去掉就OK了.要是引用Forms的话,就要将主程序的Application 传递过去代替Dll中的 Application 对象才行.