主讲:A1(老吴) 时间:2004-10-22 15:00 主题:0>一点点编译。1>解决DLL与EXE沟通时String和其它Memory的问题.2>公布hmOlevariants.pas 3>成批的偷别人的音乐文件 4>讨论使用结构好还是类好 5>讨论对象,指针,VMT

简介: 主讲:A1(老吴)时间:2004-10-22 15:00主题:0>一点点编译。1>解决DLL与EXE沟通时String和其它Memory的问题. 2>公布hmOlevariants.pas3>成批的偷别人的音乐文件4>讨论使用结构好还是类好5>讨论对象,指针,VMT 2004-10-22 14:56:20 A1.Aleyn.wu(45198124)开始上课了。

主讲:A1(老吴)
时间:2004-10-22 15:00
主题:
0>一点点编译。
1>解决DLL与EXE沟通时String和其它Memory的问题.
2>公布hmOlevariants.pas
3>成批的偷别人的音乐文件
4>讨论使用结构好还是类好
5>讨论对象,指针,VMT

2004-10-22 14:56:20 A1.Aleyn.wu(45198124)
开始上课了。

2004-10-22 14:57:27 A1.Aleyn.wu(45198124)
第一个诺言:解决DLL与EXE沟通时String和其它Memory的问题.

2004-10-22 14:58:22 A1.Aleyn.wu(45198124)
先提问,有几个已经解决了这个问题或间接解决问题了?

2004-10-22 14:58:44 /:>D10.天地弦(185511468)
用WideString是不是可以解决?

2004-10-22 14:58:56 D3天之痕若虹(86278566)
我一般用PChar来传

2004-10-22 14:59:07 C4.llyygg(13029886)
用Variant来解决的:)

2004-10-22 14:59:08 A1.Aleyn.wu(45198124)
可以,转换类型是间接的方法。

2004-10-22 14:59:52 A1.Aleyn.wu(45198124)
除了这样,大家还有什么方式?

2004-10-22 15:00:01 D3天之痕若虹(86278566)
用Strings是
DLL和Exe都要 Use sharemem

2004-10-22 15:00:37 A1.Aleyn.wu(45198124)
用ShareMem也可以,但需要BorlandMM.dll

2004-10-22 15:01:18 A1.Aleyn.wu(45198124)
给我5分钟时间,我写一个DEMO给大家。

2004-10-22 15:11:10 TCP/IP INFO(31329846)
条件编译 讲过没有

2004-10-22 15:11:24 /:>D10.天地弦(185511468)
讲了一下

2004-10-22 15:11:40 TCP/IP INFO(31329846)
我的客户端用条件编译的,中间层才用DLL。

2004-10-22 15:12:07 /:>D10.天地弦(185511468)
有什么用?TCP

2004-10-22 15:12:35 TCP/IP INFO(31329846)
我的客户端用条件编译的,咋个 条件编译,运行时编译?

2004-10-22 15:13:17 /:>D10.天地弦(185511468)
条件编译是在编译时吧

2004-10-22 15:13:34 TCP/IP INFO(31329846)
还是
{$define s}
{$ifdef s}
{$endif} 

2004-10-22 15:13:47 胡箩卜(58061178)
预编译和条件编译

2004-10-22 15:14:02 TCP/IP INFO(31329846)
还是 每次 都 用Delphi 去编译?条件编译?

2004-10-22 15:14:34 TCP/IP INFO(31329846)
预编译和条件编译,区别? 

2004-10-22 15:14:50 /:>D10.天地弦(185511468)
条件编译我也不太懂

2004-10-22 15:15:05 TCP/IP INFO(31329846)
预编译和条件编译,区别?  

2004-10-22 15:15:14 来吧!朋友(264123192)
{$define s}
后面的s是什么定义的,有点不明白?是变量还是表达式,还是其它什么的?

2004-10-22 15:15:41 来吧!朋友(264123192)
{$ifdef s}
错了
是这个

2004-10-22 15:16:30 TCP/IP INFO(31329846)
如果 定义了 S 就编译 下面的部分


2004-10-22 15:17:04 e路有你(2837760)
哦,明白了,这就是条件编译呀

2004-10-22 15:17:18 hotdog(278136300)
{}
是必须的么 (当然 add by D10)


2004-10-22 15:18:07 胡箩卜(58061178)
 # ifdef COMPUTER_A
  # define INTEGER_SIZE 16
  # else
  # define INTEGER_SIZE 32
  # endif
  即如果COMPUTER_A在前面已被定义过,则编译下面的命令行:# define INTEGER_SIZE 16 
  否则,编译下面的命令行:# define INTEGER_SIZE 32
 

2004-10-22 15:18:12 hotdog(278136300)
{$ifdef s}中s不固定类型么

2004-10-22 15:18:37 TCP/IP INFO(31329846)
一个 标识 而已

2004-10-22 15:19:00 黑了又黑(231582042)
{$R *.res} 那这个R  也是吗

2004-10-22 15:19:07 e路有你(2837760)
不是吧

2004-10-22 15:19:08 来吧!朋友(264123192)
{$IFENDF MSWINDOWS}
.....
{$ENDIF}
MSWINDOWS 这个在那里定义的?

2004-10-22 15:19:43 hotdog(278136300)
这个实体取得系统的么

2004-10-22 15:20:42 来吧!朋友(264123192)
在我调用DLL的时候
我这样写
{$IFENDF DLL1}
.....
{$ENDIF}
{$IFENDF DLL2}
.....
{$ENDIF}
我的DLL1,DLL2并没有定义呀
他为什么可以正确的执行?

2004-10-22 15:21:05 hotdog(278136300)
mswindows是系统定义的么

2004-10-22 15:21:50 来吧!朋友(264123192)
那位高手帮解说一下[?]

2004-10-22 15:22:17 /:>D10.天地弦(185511468)
{$IFENDF DLL1}
.....
{$ENDIF}
{$IFENDF DLL2}
.....
{$ENDIF}

2004-10-22 15:22:36 /:>D10.天地弦(185511468)
这个DLL1在其它的unit定义的好像不行是不是

2004-10-22 15:23:00 /:>D10.天地弦(185511468)
我试了好像不行

2004-10-22 15:23:15 TCP/IP INFO(31329846)
不行

2004-10-22 15:23:51 /:>D10.天地弦(185511468)
在project->option的Directoris/Condition页里的Conditionals defines里可以预定义
这样在整个工程就好像已经定义了。
sample:
$DEFINE DK_HRM(在Conditionals defines填入)
{$IFENDF DK_HRM}
..... //这里的代码,编译器就行编译
{$ENDIF}

2004-10-22 15:26:32 来吧!朋友(264123192)
  {$IFNDEF PENNIESLIB}
   function PenniesToCoins(TotPennies : Word;CoinsRec:PCoinsRec):Word;stdcall;
  {$ENDIF}

  {$IFNDEF PENNIESLIB}
    function  PenniesToCoins;external 'PENNIESLIB.DLL' name 'PenniesToCoins';
  {$ENDIF}

  {$IFNDEF PROJECT1}
    function frm_obj(com :TApplication):TForm ;stdcall;
    function frm_2(com :TApplication):TForm ;stdcall;
  {$ENDIF}
  {$IFNDEF PROJECT1}
    function frm_obj;external 'PROJECT1.DLL' name 'frm_obj';
    function frm_2;external 'PROJECT1.DLL' name 'frm_2';
  {$ENDIF}
 

2004-10-22 15:27:06 来吧!朋友(264123192)
这是我在一个单元里定义的两个DLL入口处

2004-10-22 15:27:50 TCP/IP INFO(31329846)
能不能 在一处 $DEFINE ,就使得其他单元 都 定义

2004-10-22 15:28:10 来吧!朋友(264123192)
他没有错
是对的
但是我有点不明白的是PENNIESLIB,PROJECT1它是怎么知道的?没有定义
这两个是我的DLL文件


2004-10-22 15:28:39 hotdog(278136300)
 {$IFNDEF PENNIESLIB}
   function PenniesToCoins(TotPennies : Word;CoinsRec:PCoinsRec):Word;stdcall;
  {$ENDIF}

  {$IFNDEF PENNIESLIB}
    function  PenniesToCoins;external 'PENNIESLIB.DLL' name 'PenniesToCoins';
  {$ENDIF}
这是另一个完整的引用么

//----------------------------------------------------------
2004-10-22 15:29:36 A1.Aleyn.wu(45198124)
好了,可以了。

2004-10-22 15:29:44 A1.Aleyn.wu(45198124)
正在上传资料。

2004-10-22 15:30:18 B1.斜阳(249208513)
千呼万唤啊

2004-10-22 15:31:36 TCP/IP INFO(31329846)
http://www.e-midas.cn/test/test.rar

2004-10-22 15:32:56 A1.Aleyn.wu(45198124)
这是个演示程序,源程序稍候传上。

2004-10-22 15:33:27 A1.Aleyn.wu(45198124)
请大家打开程序,我来说明原因。

2004-10-22 15:34:06 A1.Aleyn.wu(45198124)
打开了么,讲完一个程序,你看源代码就容易看了。

2004-10-22 15:34:34 A1.Aleyn.wu(45198124)
先打开,按我的做。

2004-10-22 15:35:12 A1.Aleyn.wu(45198124)
(1),先不打钗,点左边三个按钮。

2004-10-22 15:35:57 A1.Aleyn.wu(45198124)
我们给按钮编号吧。

2004-10-22 15:36:34 A1.Aleyn.wu(45198124)
左边第一行和第二行是不是都有错。

2004-10-22 15:36:49 A1.Aleyn.wu(45198124)
第三行没错,对不?

2004-10-22 15:37:00 TCP/IP INFO(31329846)

2004-10-22 15:37:16 A1.Aleyn.wu(45198124)
好,第二步。不打钗,点右边三个。

2004-10-22 15:37:38 A1.Aleyn.wu(45198124)
几错几对?

2004-10-22 15:37:39 Hiwe(56682960)
第一个有错

2004-10-22 15:37:40 B6(43225570)
只有中间的那个有错

2004-10-22 15:37:45 /:>D10.天地弦(185511468)
中间

2004-10-22 15:37:47 A1.Aleyn.wu(45198124)
几错几对?

2004-10-22 15:37:55 B6(43225570)
1,2

2004-10-22 15:38:12 A1.Aleyn.wu(45198124)
应该只有中间的那个有错

2004-10-22 15:38:41 A1.Aleyn.wu(45198124)
这时,第三步,打钗,点左边三个。

2004-10-22 15:39:02 A1.Aleyn.wu(45198124)
应该是全对。


2004-10-22 15:39:14 A1.Aleyn.wu(45198124)
第四步,打钗,点右边三个。


2004-10-22 15:39:27 B6(43225570)
全对

2004-10-22 15:39:48 A1.Aleyn.wu(45198124)
对,我上传源代码。

2004-10-22 15:40:00 hotdog(278136300)
这里面全部采用的预编以么

2004-10-22 15:40:49 D3天之痕若虹(86278566)
还没下载完。。。

2004-10-22 15:41:05 A1.Aleyn.wu(45198124)
http://www.e-midas.cn/test/testmm.rar

2004-10-22 15:41:07 /:>D10.天地弦(185511468)
晕,现在不是说预编译了

2004-10-22 15:41:11 A1.Aleyn.wu(45198124)
这是源代码。

2004-10-22 15:42:40 A1.Aleyn.wu(45198124)
都打项目包。

2004-10-22 15:42:56 A1.Aleyn.wu(45198124)
先看DLL。

2004-10-22 15:44:07 A1.Aleyn.wu(45198124)
看看BackupMM,RestoreMM,SetNewMM
[Code]
var
  OldMger: TMemoryManager;

procedure BackupMM; stdcall;
begin
  GetMemoryManager(OldMger);
end;

procedure RestoreMM; stdcall;
begin
  SetMemoryManager(OldMger);
end;

procedure SetNewMM(const mger: TMemoryManager); stdcall;
begin
  SetMemoryManager(mger);
end;
[/Code]

2004-10-22 15:44:16 A1.Aleyn.wu(45198124)
是不是很简单。

2004-10-22 15:44:41 A1.Aleyn.wu(45198124)
实际是,就是利用Borland的内存管理器。

2004-10-22 15:46:09 A1.Aleyn.wu(45198124)
除了对象不能用此方法,其它都可以用此方法。

2004-10-22 15:47:04 /:>D10.天地弦(185511468)
将DLL和EXE共享内存管理器

2004-10-22 15:47:13 A1.Aleyn.wu(45198124)
Right,正解!

2004-10-22 15:48:24 A1.Aleyn.wu(45198124)
还有更多的知识,慢慢来。。。。。

2004-10-22 15:49:22 A3.武稀松(42088303)
其实我觉得共享内存管理器还是带RTL和VCL的运行包来的爽快

2004-10-22 15:49:49 /:>D10.天地弦(185511468)
3哥,那样发布麻烦一点

2004-10-22 15:49:51 A1.Aleyn.wu(45198124)
to A3,道理是一样的,你看看机制就知道了。

2004-10-22 15:49:58 A1.Aleyn.wu(45198124)
包的机制。

2004-10-22 15:50:01 A3.武稀松(42088303)
我知道道理是一样的

2004-10-22 15:50:12 /:>D10.天地弦(185511468)
包机制在哪里看

2004-10-22 15:50:43 A3.武稀松(42088303)
Share不过是借管了MemoryManager而已。还不如用直接用包。

2004-10-22 15:51:25 A3.武稀松(42088303)
用包的话对象也不会用问题

2004-10-22 15:51:31 A1.Aleyn.wu(45198124)
晕,能捉到老鼠,什么方便就用什么。

2004-10-22 15:51:51 A1.Aleyn.wu(45198124)
也不可能写个小工具也用包吧。

2004-10-22 15:52:24 A3.武稀松(42088303)
使用包的话因为EXE和DLL共享包中的System单元。最起码所有TObject指针都是一个可以用Is As 操作符

2004-10-22 15:52:33 A1.Aleyn.wu(45198124)
我不反对用包,这里只是介绍一种知识而已。

2004-10-22 15:53:05 A3.武稀松(42088303)
我明白老大只是介绍一种知识。我也只是说有另一种的方式

2004-10-22 15:53:29 A1.Aleyn.wu(45198124)
还有,大家看看TestGlobalAlloc(),之前有讲过。

2004-10-22 15:54:12 A1.Aleyn.wu(45198124)
这个跟Borland的内存管理无关,所以,内存管理对它不影响。

2004-10-22 15:54:41 /:>D10.天地弦(185511468)
TestGlobalAlloc是龙卡?

2004-10-22 15:55:06 A1.Aleyn.wu(45198124)
牡丹卡。 (查看主题:内存的管理 DATE:2004-09-17 关于各种卡)

2004-10-22 15:55:24 A3.武稀松(42088303)
其实除了API以外不管哪种卡最后都是调用的GetMem转而变成_GetMem

2004-10-22 15:58:06 /:>D10.天地弦(185511468)
我的卡又忘记了。等一下要复习一下了

2004-10-22 15:58:15 B6(43225570)
GlobalAlloc是什么?

2004-10-22 15:58:42 /:>D10.天地弦(185511468)
分配内存吧

2004-10-22 16:08:23 A1.Aleyn.wu(45198124)
继续第二个诺言。

2004-10-22 16:09:26 A1.Aleyn.wu(45198124)
第二个诺言是一个源码。

2004-10-22 16:09:44 /:>D10.天地弦(185511468)
hmOleVariants?

2004-10-22 16:10:08 A1.Aleyn.wu(45198124)
/Vip/hmOleVariant.pas

2004-10-22 16:10:24 A1.Aleyn.wu(45198124)
快下载,5分钟后删除。

2004-10-22 16:10:57 Satellite(38330148)
谁知道其他什么都是通的就是网页打不开是什么原因??

2004-10-22 16:11:01 B1.斜阳(249208513)
呵呵,限时抢购啊!

2004-10-22 16:11:29 A1.Aleyn.wu(45198124)
都下载了么?


2004-10-22 16:12:51 A1.Aleyn.wu(45198124)
大家可以看一看,我是如何生成三层的参数的。


2004-10-22 16:13:23 B6(43225570)
老大,那么多的函数都实现了?

2004-10-22 16:13:36 A1.Aleyn.wu(45198124)
什么函数?

2004-10-22 16:14:22 B6(43225570)
接口和实现接口的类中定义的啊

2004-10-22 16:14:58 A1.Aleyn.wu(45198124)
这个源码就不多说了,我现在删除了,继续第三个诺言。

2004-10-22 16:15:28 B6(43225570)
对了,那把它给大家的目的就只是看,也不给讲的么?

2004-10-22 16:15:54 A1.Aleyn.wu(45198124)
在讲三层的时候已经有讲过它了,所以这里就不多说了。

2004-10-22 16:16:01 /:>D10.天地弦(185511468)
TCP和我们那个不一样

2004-10-22 16:16:25 TCP/IP INFO(31329846)
差多了,呵呵

2004-10-22 16:16:38 /:>D10.天地弦(185511468)
等下仔细看

2004-10-22 16:18:00 A1.Aleyn.wu(45198124)
第三个诺言:成批的偷别人的音乐文件。

2004-10-22 16:18:06 D3天之痕若虹(86278566)
呵,与次上说的
 TCollectItem和TCollect的实现过程有些像

2004-10-22 16:18:36 A1.Aleyn.wu(45198124)
大家都在用什么下载软件?

2004-10-22 16:18:50 HUI云中鹤(20695124)
网络快车

2004-10-22 16:18:52 TCP/IP INFO(31329846)
FlashGet

2004-10-22 16:18:53 B6(43225570)
JETCAR

2004-10-22 16:18:56 C4.llyygg(13029886)
FlashGet

2004-10-22 16:19:33 A1.Aleyn.wu(45198124)
好,多数人都用FlashGet,这次讲的,就是FlashGet.

2004-10-22 16:20:14 A1.Aleyn.wu(45198124)
大家都知识,FlashGet是用数据库来存取它的下载内容的,对不?

2004-10-22 16:20:30 C4.llyygg(13029886)
是的

2004-10-22 16:20:46 /:>D10.天地弦(185511468)
下载的内容?

2004-10-22 16:20:46 A3.武稀松(42088303)
数据库???

2004-10-22 16:20:51 /:>D10.天地弦(185511468)
你说下载列表?

2004-10-22 16:20:59 A1.Aleyn.wu(45198124)
对,就是下载列表。

2004-10-22 16:21:19 D3天之痕若虹(86278566)
是说下载列表保存在和个 自定义格式的数据库

2004-10-22 16:21:24 A1.Aleyn.wu(45198124)
对。

2004-10-22 16:21:43 D3天之痕若虹(86278566)
这个数据库,一样可以使用ADO相关?

2004-10-22 16:21:53 A1.Aleyn.wu(45198124)
所以,我们最主要的就是如何跟据我们的需要生成下载列表。

2004-10-22 16:22:51 A1.Aleyn.wu(45198124)
建一个新的下载列表,用UltraEdit来看看,你就会发现一些规则。

2004-10-22 16:23:26 B6(43225570)
是些汇编内容么?

2004-10-22 16:23:29 A1.Aleyn.wu(45198124)
再在下载列表中增加一些下载文件,就会看到新增了数据,但规则是差不多的。

2004-10-22 16:23:42 D3天之痕若虹(86278566)
mirrors.lst??这文件?

2004-10-22 16:24:14 A1.Aleyn.wu(45198124)
不是。是*.jcd

2004-10-22 16:26:13 A1.Aleyn.wu(45198124)
然后,有几个音乐网站的下载地址多数是:
http://xxx.xxx/xxx/0001/1.wmv

2004-10-22 16:27:03 A1.Aleyn.wu(45198124)
你只是跟据你的需要,生成前面的0001~9999和后面的1~20就可以了。

2004-10-22 16:27:11 A1.Aleyn.wu(45198124)
生成后,你就去下吧。

2004-10-22 16:27:58 A1.Aleyn.wu(45198124)
好了,今天的课到此为止,Class over.

2004-10-22 16:28:28 A1.Aleyn.wu(45198124)
有下载地址,JCD的结构我也在研究中。

2004-10-22 16:28:54 A1.Aleyn.wu(45198124)
目前,我已经下载了0000~0040了。

2004-10-22 16:29:17 A1.Aleyn.wu(45198124)
共 40*10 = 400个wmv左右。

2004-10-22 16:30:22 B1.斜阳(249208513)
图片的名字才多上0001什么的,歌曲的名字多数是用拼音字母什么的

2004-10-22 16:30:30 HUI云中鹤(20695124)
老大的网站上放些音乐,我们去听听

2004-10-22 16:33:07 B1.斜阳(249208513)
有个问题一直犹豫不决,不知道大家有没有好的办法

2004-10-22 16:33:22 B1.斜阳(249208513)
就拿A1刚刚公布的单元来说吧

2004-10-22 16:33:43 B1.斜阳(249208513)
像这样的数据结构
  POleVariantField = ^TOleVariantField;
  TOleVariantField = record
    FieldName: string[20];
    Value: OleVariant;
  end;

  POvfa = ^AOleVariantField;
  AOleVariantField = array of OleVariant;

2004-10-22 16:34:17 B1.斜阳(249208513)
其实作为一个TOleVariantField来说,是应该作成一个类还是简单封装成一个数据结构呢

2004-10-22 16:34:56 C4.llyygg(13029886)
我觉得是数据结构,他本身就只是存数据的嘛:)

2004-10-22 16:34:58 A1.Aleyn.wu(45198124)
这个想法我也有考虑过一些时间。

2004-10-22 16:35:11 A1.Aleyn.wu(45198124)
后来有做了实验。

2004-10-22 16:35:20 B1.斜阳(249208513)
如果作成一个数据结构,那么对于类似FieldValue什么的取值的方法就需要别的类去代替这个数据结构来完成

2004-10-22 16:35:44 A1.Aleyn.wu(45198124)
类的内存耗太大了。所以用结构好一些。

2004-10-22 16:36:41 B1.斜阳(249208513)
还有,对于FindField这样的工作,本来应该是这个数据结构自身的功能,如果单纯用一个记录类型,那么这些工作就需要别的类来帮助他完成

2004-10-22 16:37:43 B1.斜阳(249208513)
有的时候,类似这样的问题会碰到好多,是用记录类型还是用类,往往犹豫不决

2004-10-22 16:37:52 C4.llyygg(13029886)
还有,对于FindField这样的工作,本来应该是这个数据结构自身的功能,如果单纯用一个记录类型,那么这些工作就需要别的类来帮助他完成
--不会吧,自己可以找到别的类?
 
2004-10-22 16:38:16 A1.Aleyn.wu(45198124)
如果不考虑速度和内存,就用类,否则用结构。

2004-10-22 16:38:57 B1.斜阳(249208513)
如果你某个类包含了这样的数据结构,那么你这个类就要去完成这些工作,不是这样吗 C4?

2004-10-22 16:39:17 C4.llyygg(13029886)
是的,

2004-10-22 16:39:51 /:>D10.天地弦(185511468)
B1这个问题可以结束了

2004-10-22 16:39:52 /:>D10.天地弦(185511468)
45198124(A1.Aleyn.wu) 16:38:16
如果不考虑速度和内存,就用类,否则用结构。 

2004-10-22 16:39:54 B1.斜阳(249208513)
速度问题可能不会有太多的损耗,主要是内存开销

2004-10-22 16:40:19 C4.llyygg(13029886)
但是一个类本身就是包含数据的处理嘛, 最小的类也有数据的,如果这样下去就没有数据,只有类?晕了

2004-10-22 16:40:45 B1.斜阳(249208513)
Java不就是这么个概念

2004-10-22 16:40:46 A1.Aleyn.wu(45198124)
呵呵,你试一下,建立1K个这样的类和结构,比较一下。

2004-10-22 16:41:40 B1.斜阳(249208513)
不知道大家在这个问题上如何处理?

2004-10-22 16:41:54 A3.武稀松(42088303)
Java只能用类了

2004-10-22 16:42:28 B1.斜阳(249208513)
如果按照面向对象的思想,应该抽象成类,但是偏偏Delphi又给大家提供了这么好的东西,可以让我们作成一个记录类型[:D]

2004-10-22 16:42:30 C4.llyygg(13029886)
其实我主要是不明白,如果数据结构改成类的话, 把一个类看成一个节点, FindField怎么能够完成找到其他类啊?.

2004-10-22 16:42:53 A3.武稀松(42088303)
类如果没有VMT和结构区别不大。

2004-10-22 16:43:11 B1.斜阳(249208513)
有Field类,就应该有Fields类

2004-10-22 16:43:17 A1.Aleyn.wu(45198124)
赞成A3

2004-10-22 16:43:32 A1.Aleyn.wu(45198124)
VMT开消大。

2004-10-22 16:43:55 B1.斜阳(249208513)
VMT也是一个类只有一份而已啊

2004-10-22 16:43:56 /:>D10.天地弦(185511468)
A3你说InsideVCL上说VMT有错是不是

2004-10-22 16:44:08 A3.武稀松(42088303)
我觉得是有错

2004-10-22 16:44:18 /:>D10.天地弦(185511468)
错在哪里

2004-10-22 16:44:34 /:>D10.天地弦(185511468)
是不是只有前面几章讲了VMT

2004-10-22 16:46:13 A3.武稀松(42088303)
他认为每个对象有一个虚方法表。我觉得应该是一个虚方法表的指针。因该每个类有一个虚方法表吧

2004-10-22 16:50:38 D3天之痕若虹(86278566)
<<InsideVCL>>没去看过,不知到里讲了什么

2004-10-22 16:51:21 /:>D10.天地弦(185511468)
认为是一个类是一个虚方法表是吧

2004-10-22 16:51:35 /:>D10.天地弦(185511468)
对象有一个指针

2004-10-22 16:53:09 A3.武稀松(42088303)
类是一个指针

2004-10-22 16:54:06 /:>D10.天地弦(185511468)
一个类对应一个VMT?

2004-10-22 16:54:30 /:>D10.天地弦(185511468)
一个对象没有对应一个VMT?

2004-10-22 16:54:38 /:>D10.天地弦(185511468)
3哥是不是这样

2004-10-22 16:54:48 A3.武稀松(42088303)
反正我觉得VMT应该是属于类的而不是对象的。对象只有一个指向VMT的指针而已

2004-10-22 16:55:12 /:>D10.天地弦(185511468)
明你的意思

2004-10-22 16:55:25 /:>D10.天地弦(185511468)
不知道现在新版有没有改过来

2004-10-22 16:55:36 A3.武稀松(42088303)
我不敢肯定是不是错误喔

2004-10-22 16:55:50 /:>D10.天地弦(185511468)
我好像没有看到他说一个对象对应一个VMT呢

2004-10-22 16:56:07 /:>D10.天地弦(185511468)
哦,我今天晚上再去翻下

2004-10-22 16:56:52 A3.武稀松(42088303)
我以前曾经想设计一个面向对象的PASCAL的编译器。所以思考过这个实现问题。我觉得这样才是合理的。反正也许Borland的设计人员和我想的不一样

2004-10-22 16:57:18 /:>D10.天地弦(185511468)
[strong],牛了!

2004-10-22 16:57:38 /:>D10.天地弦(185511468)
应该是这样的

2004-10-22 16:57:38 A3.武稀松(42088303)
别夸奖了。没设计出来。

2004-10-22 16:58:03 A3.武稀松(42088303)
不过因为这个我思考了好些东西。学习了好些知识

2004-10-22 17:01:01 B1.斜阳(249208513)
var
  pp1, pp2: Pointer;
begin
  pp1 := Pointer(Button1);
  pp2 := Pointer(Button2);
  Memo1.Lines.Add(IntToStr(Integer(pp1)));
  Memo1.Lines.Add(IntToStr(Integer(pp2)));
  pp1 := Pointer(pp1^);
  pp2 := Pointer(pp2^);
  Memo1.Lines.Add(IntToStr(Integer(pp1)));
  Memo1.Lines.Add(IntToStr(Integer(pp2)));
A3 这段代码就能验证你的想法是对的


2004-10-22 17:01:38 B1.斜阳(249208513)
在窗体上放两个Button再放一个Memo

2004-10-22 17:02:43 B1.斜阳(249208513)
第一次取的是各自的self的内容,第二次取的是各自self所指向的地方,呵呵,是一个地方

2004-10-22 17:03:45 /:>D10.天地弦(185511468)
你们都很牛,哎!
我指针都用得很少。始终成不了高手

2004-10-22 17:04:42 A3.武稀松(42088303)
做应用高手

2004-10-22 17:05:21 /:>D10.天地弦(185511468)
呵呵

2004-10-22 17:05:33 D3天之痕若虹(86278566)
  pp1 := Pointer(pp1^);
  pp2 := Pointer(pp2^);
指向同个地方? 为什么

2004-10-22 17:06:12 B1.斜阳(249208513)
指向了类

2004-10-22 17:06:13 A3.武稀松(42088303)
我虽然认为编译器应该是这样设计的。但是一直没验证过。
谢谢B1


2004-10-22 17:07:17 /:>D10.天地弦(185511468)
var
  pp1, pp2, pp3, pp4: Pointer;
begin
  pp1 := Pointer(Button1);
  pp2 := Pointer(Button2);
  Memo1.Lines.Add(IntToStr(Integer(pp1)));
  Memo1.Lines.Add(IntToStr(Integer(pp2)));
  pp3 := Pointer(pp1^);
  pp4 := Pointer(pp2^);
  Memo1.Lines.Add(IntToStr(Integer(pp3)));
  Memo1.Lines.Add(IntToStr(Integer(pp4)));

2004-10-22 17:07:34 B1.斜阳(249208513)
其实,如果顺着这个地址,按照一定的偏移量,你就可以找到类相关类方法,然后就可以通过指针调用这些类方法,不过这样比较危险噢


2004-10-22 17:08:21 /:>D10.天地弦(185511468)
  pp1 := Pointer(Button1);
  pp2 := Pointer(Button2);

  pp1 := @Button1;
  pp2 := @Button2;

2004-10-22 17:09:19 B1.斜阳(249208513)
你看看你取道的内容都是什么,你就清楚了,一个指针就是一个整型数

2004-10-22 17:09:56 /:>D10.天地弦(185511468)
@是取地址

2004-10-22 17:10:46 A3.武稀松(42088303)
pp1 := @Button1;是Button这个类的地址。因为类是指针。就是指真的地址。就是说PP1是指针的指针

2004-10-22 17:11:01 A3.武稀松(42088303)
pp1 := @Button1;是Button这个变量的地址。因为类是指针。就是指真的地址。就是说PP1是指针的指针 

2004-10-22 17:11:34 /:>D10.天地弦(185511468)

2004-10-22 17:11:43 /:>D10.天地弦(185511468)
明了一点

2004-10-22 17:11:50 B1.斜阳(249208513)
A3 第二遍还是有错误,再来一遍[:D]

2004-10-22 17:11:50 A3.武稀松(42088303)
pp1 := Pointer(Button1);
PP1和Button1指向同一个地址

2004-10-22 17:12:04 /:>D10.天地弦(185511468)
@Button1 是Button1这个变量的地址?

2004-10-22 17:12:26 A3.武稀松(42088303)
B1把类字都替换成变量就行了

2004-10-22 17:12:58 /:>D10.天地弦(185511468)
pp1 := @Button1;是Button这个变量的地址。因为变量是指针。就是指真的地址。就是说PP1是指针的指针  ?

2004-10-22 17:13:05 /:>D10.天地弦(185511468)
A3是不是这样?

2004-10-22 17:13:14 /:>D10.天地弦(185511468)
因为变量是指针?

2004-10-22 17:13:22 /:>D10.天地弦(185511468)
因为变量是对象

2004-10-22 17:13:23 A3.武稀松(42088303)
pp1 := @Button1;是Button这个变量的地址。因为类类型变量是指针。就是指针的地址。就是说PP1是指针的指针  ? 

2004-10-22 17:13:39 /:>D10.天地弦(185511468)
嗯,对了

2004-10-22 17:14:12 A3.武稀松(42088303)
Button1是类类型变量不是真正的内存对象,这个指针指向的是真正的对象

2004-10-22 17:14:47 B1.斜阳(249208513)
var
  m: Integer
  pi: ^Integer;
  pp: Pointer;
begin
  m := 10;
  pi := @m;
  pp := Pointer(pi);
end;
 

2004-10-22 17:14:49 /:>D10.天地弦(185511468)
Button1是类类型变量(不能说是对象么)

2004-10-22 17:15:47 A3.武稀松(42088303)
其实Button1^才是对象不过编译器把^给省略了

2004-10-22 17:16:16 B1.斜阳(249208513)
Button1-->|-------|
          |  对象 |
          |_______|

2004-10-22 17:16:24 B1.斜阳(249208513)
形象吧[:D]

2004-10-22 17:17:43 A3.武稀松(42088303)
Button1是类类型变量是我给起的名字。我觉得这样才准确

2004-10-22 17:18:18 /:>D10.天地弦(185511468)
var
  Form1: TForm1;

2004-10-22 17:18:31 /:>D10.天地弦(185511468)
3哥,这个Form1也是类类型变量了

2004-10-22 17:18:32 B1.斜阳(249208513)
这个类类型,容易引起混淆

2004-10-22 17:18:47 A3.武稀松(42088303)
Yes

2004-10-22 17:19:03 A3.武稀松(42088303)
那B1你说什么名字比较贴切

2004-10-22 17:19:25 B1.斜阳(249208513)
确切说
type
  TButtonClass = TButton
TButtonClass才叫类类型

2004-10-22 17:19:45 B1.斜阳(249208513)
我也没想好该怎么说

2004-10-22 17:20:24 A3.武稀松(42088303)
我们给Borland规范一下名词

2004-10-22 17:20:27 B1.斜阳(249208513)
如果非要区分,现在我只是用"指向对象实例的指针"

2004-10-22 17:20:47 B1.斜阳(249208513)
不过这个也不太好听,并且太长

2004-10-22 17:21:25 A3.武稀松(42088303)
对象指针,类类型变量 我觉得都行

2004-10-22 17:22:04 /:>D10.天地弦(185511468)
Class-reference types中文怎么样

2004-10-22 17:22:07 /:>D10.天地弦(185511468)
怎么说
类引用类型?

2004-10-22 17:22:37 B1.斜阳(249208513)
这是Delphi好的地方,也是我觉得他比较别扭的地方,所谓名不正就言不顺,就是这个了

2004-10-22 17:23:05 /:>D10.天地弦(185511468)
就是哪个了,B1

2004-10-22 17:23:18 A3.武稀松(42088303)
但是现在这个方式比较流行了。Java,C #都这样搞

2004-10-22 17:23:25 B1.斜阳(249208513)
本来是个指针,却不遵循自己定义的使用指针的约定,整的大家直迷糊

2004-10-22 17:23:52 A3.武稀松(42088303)
这个是趋势

2004-10-22 17:23:59 /:>D10.天地弦(185511468)
249208513(B1.斜阳) 17:19:25
确切说
type
  TButtonClass = TButton
TButtonClass才叫类类型 

2004-10-22 17:24:34 B1.斜阳(249208513)
D10:就是
var
  Button1: TButton;
这个Button1就比较别扭,不过还是顺应潮流吧

2004-10-22 17:24:35 /:>D10.天地弦(185511468)
  TComponentClass = class of TComponent;
 

2004-10-22 17:24:49 /:>D10.天地弦(185511468)

2004-10-22 17:25:09 /:>D10.天地弦(185511468)
  TButtonClass = TButton
  TComponentClass = class of TComponent;
这两种是什么意思

2004-10-22 17:25:13 B1.斜阳(249208513)
噢,对对,我写错了,呵呵今天不适合编程序

2004-10-22 17:25:28 /:>D10.天地弦(185511468)
B1是你写错了?

2004-10-22 17:25:40 /:>D10.天地弦(185511468)
  TButtonClass = TButton没有这种写法是吧
 
2004-10-22 17:26:06 B1.斜阳(249208513)
这种写法就是给他起个别名了,还是个不合格的别名[:D]

2004-10-22 17:27:07 /:>D10.天地弦(185511468)
  TButtonClass = TButton;A3教过我

2004-10-22 17:27:24 /:>D10.天地弦(185511468)
是TButton类的一个别名是吧

2004-10-22 17:27:33 B1.斜阳(249208513)
是的是的

2004-10-22 17:27:34 /:>D10.天地弦(185511468)
下班吃饭了,谢谢两位

目录
相关文章
|
23天前
|
算法 C语言
C语言中的文件操作技巧,涵盖文件的打开与关闭、读取与写入、文件指针移动及注意事项
本文深入讲解了C语言中的文件操作技巧,涵盖文件的打开与关闭、读取与写入、文件指针移动及注意事项,通过实例演示了文件操作的基本流程,帮助读者掌握这一重要技能,提升程序开发能力。
70 3
|
24天前
|
存储 编译器 C语言
【c++丨STL】string类的使用
本文介绍了C++中`string`类的基本概念及其主要接口。`string`类在C++标准库中扮演着重要角色,它提供了比C语言中字符串处理函数更丰富、安全和便捷的功能。文章详细讲解了`string`类的构造函数、赋值运算符、容量管理接口、元素访问及遍历方法、字符串修改操作、字符串运算接口、常量成员和非成员函数等内容。通过实例演示了如何使用这些接口进行字符串的创建、修改、查找和比较等操作,帮助读者更好地理解和掌握`string`类的应用。
38 2
|
1月前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
86 4
|
2月前
|
Java
【编程基础知识】(讲解+示例实战)方法参数的传递机制(值传递及地址传递)以及String类的对象的不可变性
本文深入探讨了Java中方法参数的传递机制,包括值传递和引用传递的区别,以及String类对象的不可变性。通过详细讲解和示例代码,帮助读者理解参数传递的内部原理,并掌握在实际编程中正确处理参数传递的方法。关键词:Java, 方法参数传递, 值传递, 引用传递, String不可变性。
67 1
【编程基础知识】(讲解+示例实战)方法参数的传递机制(值传递及地址传递)以及String类的对象的不可变性
|
2月前
|
安全 Java 测试技术
Java零基础-StringBuffer 类详解
【10月更文挑战第9天】Java零基础教学篇,手把手实践教学!
52 2
|
2月前
|
存储 安全 C++
【C++打怪之路Lv8】-- string类
【C++打怪之路Lv8】-- string类
26 1
|
2月前
|
数据可视化 Java
让星星月亮告诉你,通过反射创建类的实例对象,并通过Unsafe theUnsafe来修改实例对象的私有的String类型的成员属性的值
本文介绍了如何使用 Unsafe 类通过反射机制修改对象的私有属性值。主要包括: 1. 获取 Unsafe 的 theUnsafe 属性:通过反射获取 Unsafe类的私有静态属性theUnsafe,并放开其访问权限,以便后续操作 2. 利用反射创建 User 类的实例对象:通过反射创建User类的实例对象,并定义预期值 3. 利用反射获取实例对象的name属性并修改:通过反射获取 User类实例对象的私有属性name,使用 Unsafe`的compareAndSwapObject方法直接在内存地址上修改属性值 核心代码展示了详细的步骤和逻辑,确保了对私有属性的修改不受 JVM 访问权限的限制
64 4
|
2月前
|
存储 安全 Java
【一步一步了解Java系列】:认识String类
【一步一步了解Java系列】:认识String类
28 2
|
2月前
|
C语言 C++
C++番外篇——string类的实现
C++番外篇——string类的实现
22 0
|
2月前
|
C++ 容器
C++入门7——string类的使用-2
C++入门7——string类的使用-2
23 0