主页
Top.Mail.Ru Yandeks.Metrika
论坛:“主要”;
当前存档:2002.07.29;
下载:[xml.tar.bz2];

向下

使用DLL。 Assign方法不希望被执行.. :( 找到类似的分支


Гас   (2002-07-16 10:01) [0]

因此,我第一次决定使用DLL,在我尝试制作FFont.Assign(DLLReturnsFont)之前,一切工作都很好。
不想跑!
写入“无法将TFont分配给TFont”。
怎么了,有人知道吗? 谢谢啦



Digitman   (2002-07-16 10:33) [1]


过程TPersistent.Assign(来源:TPersistent);
开始
如果Source <> nil,则Source.AssignTo(Self);否则AssignError(nil);
结束;

过程TPersistent.AssignError(来源:TPersistent);
VAR
SourceName:字符串;
开始
如果Source <>那么
SourceName:=其他Source.ClassName
SourceName:=“无”;
引发EConvertError.CreateResFmt(@SAssignError,[SourceName,ClassName]);
结束;

从这里很明显,由于某种原因,DLLReturnsFont为零



reonid   (2002-07-16 10:40) [2]

分配通常通过RTTI进行-
用/ /检查Source。
主应用程序和DLL中的TFont类是不同的类,
(尽管相同)。

因此,通常不会导出DLL中的类。



Eugene Lachinov   (2002-07-16 10:42) [3]

在这里,大概我们需要处理的Source是TFont :-)的实现,通常是



Игорь Шевченко   (2002-07-16 10:57) [4]

DLL中的字体和EXE中的字体具有不同的RTTI地址,因此Is语句将不起作用。



Гас   (2002-07-16 11:58) [5]

谢谢您的关注,我在这里挖了一点,已经意识到这并不那么简单。 但是我还不知道如何从DLL传输字体属性。 无论如何,如何转移物体?



Skier   (2002-07-16 12:04) [6]

>古斯

>但是我还不知道如何从
> DLL

您真的需要这种方法吗?



Digitman   (2002-07-16 12:04) [7]

任何对象的转移实质上等于其属性的转移。 因此起舞:您读取源对象的属性值-将此值记录在接收器对象的相应属性中。



Гас   (2002-07-16 12:11) [8]

ToSkier:我需要从那里获取字体属性,我不知道该怎么做..

ToDigitman:我不想相信这是唯一的方法。 :)事实证明,这是非常普遍的事情。



Digitman   (2002-07-16 12:17) [9]

您如何看待-Assign()方法以某种奇妙的神奇方式实现了? 它的作用完全相同,只是在许多情况下-对程序员是透明的,甚至使用AssignTo()helper方法也是如此。



Skier   (2002-07-16 12:20) [10]

>古斯
有可能(如果您不考虑TFont
到流中):将TFont属性“收集”到字符串中,并在从DLL接收时对其进行解析。



Гас   (2002-07-16 12:48) [11]

是的,我已经在源代码中查看过Assign,但是我只是想更全局地设置任务,即,如何访问DLL中创建的对象。
如何从DLL传递字符串? 我认为这也不容易..



Skier   (2002-07-16 12:51) [12]

>古斯

>以及如何从DLL中传递字符串?

有必要传输的不是字符串,而是PChar

>我认为这也不容易..


比萝卜简单...



Гас   (2002-07-16 12:55) [13]

顺便说一句,那我该如何访问(从DLL字体).Color,(从DLL字体).Style等。 :(



Гас   (2002-07-16 13:00) [14]

ToSkier:是的,的确,我没有考虑过PChar。 但是,真的没有其他解决方案吗?



Digitman   (2002-07-16 13:08) [15]

为什么不能访问在宿主应用程序和DLL中均声明但在DLL调用上下文中创建的对象? 我不明白这里可能会有什么困难。

澄清在什么地方以及如何声明DLLReturnsFont变量,在什么上下文中以及如何使用对TFont类的某个对象的引用填充它



Skier   (2002-07-16 13:08) [16]

>古斯
我可以通过TWriter将St.TFont写入TStream吗?
但为什么你需要这一切呢?
您的目标是什么?



Гас   (2002-07-16 13:40) [17]

>您的目标是什么?
学习:)



Eugene Lachinov   (2002-07-16 13:46) [18]

函数IgnoreProp(常量PropName:字符串):布尔值;
开始
结果:=(CompareText(PropName,“活动”)= 0)或
(CompareText(PropName,“已连接”)= 0)或
(CompareText(属性名称,“名称”)= 0)
结束;

过程CopyObject(const Source,Dest:TObject);
VAR
PropList:PPropList;
i,iPropCount:整数;
开始
iPropCount:= GetPropList(源,PropList);
对于我:= 0到iPropCount-1做
与PropList ^ [i] ^如果不是IgnoreProp(名称),则执行
case PropType ^^。的种类
tkInteger,tkChar,tkWChar,tkEnumeration,tkSet,
tkFloat,tkString,tkLString,tkWString,tkVariant,
tkInt64,tkDynArray:SetPropValue(目标,名称,GetPropValue(源,名称));
tkClass:SetObjectProp(目标,名称,GetObjectProp(源,名称));
结束
结束;

...

CopyObject(DLLReturnsFont,FFont);



Eugene Lachinov   (2002-07-16 14:10) [19]

错过了FreeMem

过程CopyObject(const Source,Dest:TObject);
VAR
PropList:PPropList;
i,iPropCount:整数;
开始
iPropCount:= GetPropList(源,PropList);
如果iPropCount> 0,请尝试
对于我:= 0到iPropCount-1做
与PropList ^ [i] ^如果不是IgnoreProp(名称),则执行
case PropType ^^。的种类
tkInteger,tkChar,tkWChar,tkEnumeration,tkSet,
tkFloat,tkString,tkLString,tkWString,tkVariant,
tkInt64,tkDynArray:SetPropValue(目标,名称,GetPropValue(源,名称));
tkClass:SetObjectProp(目标,名称,GetObjectProp(源,名称));
结束
最后
FreeMem(属性列表)
结束
结束;



Гас   (2002-07-16 14:21) [20]

看来您需要什么,谢谢! 那么,对象本身无法以任何方式获得吗?



Digitman   (2002-07-16 15:06) [21]

什么是“获取对象”?



Гас   (2002-07-16 15:25) [22]

我已经有点困惑了.. :)我只是想说你不能将对象作为参数传递,事实证明。



Mystic   (2002-07-16 15:37) [23]

安装“使用运行时打包工具构建”选项(或至少仅使用vcl)可以解决此问题。

我对这个问题的几点想法可能会有所帮助:
http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1026672057&n=0



Гас   (2002-07-16 15:41) [24]

Sapsibo,我将消化接收到的信息:)



Digitman   (2002-07-16 17:44) [25]

为什么不呢 您可以转移。 不仅对象本身,还包括类的现有实例的地址。 宿主进程和DLL的地址空间相同,RTTI(即使在多个实例中放弃了带有运行时打包的Build)也是相同的(如果宿主应用程序和DLL组装在相同的位置)同一版本的Delphi)



Юрий Зотов   (2002-07-16 18:42) [26]

转移地址不是问题,问题有所不同。

宿主程序和DLL被编译为两个独立的项目。 因此,每个类都有其自己的类表。 主机上下文中的TFont和DLL上下文中的同一TFont是DIFFERENT表中的两个条目,即形式上是两个DIFFERENT类。 因此,Assign不起作用-如果它检查Source是否为TFont,则不会通过。 与其他所有类相同。

如果使用运行时程序包编译,则不会发生这些问题。 否则,您将必须在DLL和主机之间执行接口中介类。 我必须对此类进行雕刻,根据我自己的经验,我可以说使用运行时包更好。 简单,可靠,轻松-Borland绝对不傻。



Страницы: 1 整个分支

论坛:“主要”;
当前存档:2002.07.29;
下载:[xml.tar.bz2];

楼上





内存:0.64 MB
时间:0.031 c
4-95601
DenNNis
2002-05-21 15:48
2002.07.29
ShellExecute的


1-95390
叶夫根尼
2002-07-16 09:36
2002.07.29
输入Str


4-95595
Voland!
2002-05-21 02:16
2002.07.29
老鼠


1-95435
eruc
2002-07-16 18:16
2002.07.29
XML ????


4-95597
斯特拉特
2002-05-21 17:00
2002.07.29
使用非系统按钮最小化程序





南非荷兰语 阿尔巴尼亚人 阿拉伯语 亚美尼亚 阿塞拜疆 巴斯克 白俄罗斯 保加利亚语 加泰罗尼亚 简体中文 中国(繁体) 克罗地亚 捷克 丹麦语 荷兰人 英语 爱沙尼亚语 菲律宾人 芬兰 法语
加利亚西语 格鲁吉亚语 德语 希腊语 海地克里奥尔语 希伯来语 印地语 匈牙利 北日耳曼语 印度尼西亚人 爱尔兰语 意大利语 日本 韩语 拉脱维亚 立陶宛 马其顿 马来语 马耳他语 挪威语
波斯语 波兰语 葡萄牙语 罗马尼亚 俄语 塞尔维亚 斯洛伐克 斯洛文尼亚 西班牙语 斯瓦希里 瑞典语 泰国人 土耳其 乌克兰 乌尔都语 越南人 威尔士语 意第绪语 孟加拉 波斯尼亚
宿务 世界语 古吉拉特语 豪萨语 苗族 伊博 爪哇 卡纳达语 高棉 老挝 拉丁语 毛利 马拉 蒙古人 尼泊尔 旁遮普 索马里 淡米尔文 泰卢固语 约鲁巴语
祖鲁
英文 Французский Немецкий Итальянский Португальский 俄文 Испанский