唉, 真的对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;这样在外面操作才不会出错的
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;这样在外面操作才不会出错的
解决方案 »
- 俄文在那个区呢?
- 求SQL语句
- 有 系统提供的 SUBST 命令的API函数????
- 关于ShellExcute的问题(急救)
- 怎么在DELPHI6中创建EXCEL文件?并在其中填入内容?
- 出现httpodbc.dll的文件是什么病毒啊?
- 关于字符串中包含单引号的字符串怎样赋值给变量;
- teechar关于甘特图序列操作的鼠标事件
- 如何在最小代價下增加新功能模塊?
- 怎样才能从TDateTime 中取出月份
- 用Delphi调用按键精灵的COM组件问题
- 我在ACTIVEXFORM中SHOWMODAL显示另一个窗口,打开一个窗口没问题,同时打开两个含有该控件并且一起显示SHOWMODAL窗口时,另一个弹出的窗口就有问题,类似于内存泄漏之类的错误
为何没有人会掉过来, 在外面创建对象然后传给COM, 让COM返回个接口呢?
道理是很简单的C++中用的是指针的指针IUnknown** ppiObj
DELPHI中用的是 out obj
感受最深的就是在dll中无法实用fastreport的自带预览窗口,每次都要自己弄一个,真是麻烦.
不知道是delphi的错,还是fastreport的错.呵呵,最希望是我自己的错,希望有一天能找到解决这个问题的办法.
dll得初始化和销毁例程在delphi里面都克实现得
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);
DllProc
ExitProc
这类东西, 那还是有什么呢? 有多少本书说Dll的时候会提到DELPHI中这两个变量? 看过很多本了, 结果还是上网下载某段程序然后才得知原来是要赋这个变量的值.
String跟PChar的变换, 当String为单字符和字符串的时候, PChar的变换会变换成那样, 又有谁一开始就知道呢?
procedure CreateObj( var XXObject: TXXObject);
begin
XXObject := TXXObject.Create(XXXOwner);
end;
如果这样
procedure CreateObj( out XXObject: TXXObject);
begin
XXObject := TXXObject.Create(XXXOwner);
end;
即:var ———> out
是否就可以了?!