唉, 真的对DELPHI无语
WINMain给收起来
DllMain也给收起来今晚弄个Dll窗体, 就因为个TScreen(不传收不到键盘消息)
还有就是DllProc找了几个小时( 不传函数指针判断不了 DLL_PROCESS_DETACH )TObject这类明明是指针却要弄成像普通变量一样, 弄到不知道多少新手会写出procedure CreateObj( var XXObject: TXXObject);
begin
  XXObject := TXXObject.Create(XXXOwner);
end;然后在外面去调用和释放, 陷害不少无辜百姓!在网上找了N久, 看到个DLL_PROCESS_DETACH 才想起C++写个DLLMain是有个Reason参数进行判断, DLL加载和退出都可以判断的就是DELPHI藏起来了, 搞到不知道如何是好,而且居然还每一本提及到DLL的书籍对这个那么重要的东西都只字不提的!散分也得要骂一下!我靠!!顺带提一下, 想要传入一个没有创建的对象在其他函数中创建, 是必须type
  PTXXObject = ^TXXObject;procedure CreateObj( var pXXObject: PTXXObject );
begin
  pXXObject^ := TXXObject.Create(XXXOwner);
end;这样在外面操作才不会出错的

解决方案 »

  1.   

    COM中的类工厂就是在DLL中创建对象, 让外部通过接口访问, 
    为何没有人会掉过来, 在外面创建对象然后传给COM, 让COM返回个接口呢?
    道理是很简单的C++中用的是指针的指针IUnknown** ppiObj 
    DELPHI中用的是 out obj
      

  2.   

    Delphi的DLl确实经常除向莫名其妙的问题.
    感受最深的就是在dll中无法实用fastreport的自带预览窗口,每次都要自己弄一个,真是麻烦.
    不知道是delphi的错,还是fastreport的错.呵呵,最希望是我自己的错,希望有一天能找到解决这个问题的办法.
      

  3.   

    DLL和delphi没啥关系,关键是理解dll
    dll得初始化和销毁例程在delphi里面都克实现得
      

  4.   

    library Dll;var
      SaveInit, SaveExit: Pointer;procedure DllMain(dwReason: DWORD);
    begin
      case dwReason of
        DLL_PROCESS_ATTACH: LibInit();//进程进入时
        DLL_PROCESS_DETACH: LibExit();//进程退出时
        DLL_THREAD_ATTACH: OutputDebugString('DLL_THREAD_ATTACH');//线程进入时
        DLL_THREAD_DETACH: OutputDebugString('DLL_THREAD_DETACH');//线程退出时
        else               OutputDebugString('It is impossible!');//不可能的
      end;
    end;
    //============================================================================//
    //                                                                            //
    //                          DLL 初始化部分结束                                //
    //                                                                            //
    //============================================================================////============================================================================//
    //                                                                            //
    //                            DLL导出函数表                                   //
    //                                                                            //
    //============================================================================//
    exports
      Start Name 'Start',
      Stop Name 'Stop';begin
      SaveInit := @DllProc;
      DllProc := @DllMain;
      SaveExit := ExitProc;
      ExitProc := @LibExit;
        
      DllMain(DLL_PROCESS_ATTACH);
    end.
    再好好学习就不骂人了。
    CreateObj,从名字就可以看出是一个Object; 而且,你可以看看大部分类厂,都有一个CreateObject,或者CreateInstance都是这个形式, 而且,通常是void **,类似于(var obj: Pointer);或者说(obj: ^Pointer);
      

  5.   

    那如果不知道在SysInit单元里面, 有这两个变量: 
    DllProc
    ExitProc
    这类东西, 那还是有什么呢? 有多少本书说Dll的时候会提到DELPHI中这两个变量? 看过很多本了, 结果还是上网下载某段程序然后才得知原来是要赋这个变量的值.
    String跟PChar的变换, 当String为单字符和字符串的时候, PChar的变换会变换成那样, 又有谁一开始就知道呢? 
      

  6.   

    顶一下,关于参数传递的问题
    procedure CreateObj( var XXObject: TXXObject);
    begin
      XXObject := TXXObject.Create(XXXOwner);
    end; 
    如果这样
    procedure CreateObj( out XXObject: TXXObject);
    begin
      XXObject := TXXObject.Create(XXXOwner);
    end; 
    即:var ———> out
    是否就可以了?!