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

向下

使用DLL 找到类似的分支


minotavr   (2003-04-08 17:20) [0]

各位大家好
人们帮忙。
有一个用于处理数据库的程序。 我想制作一个DLL,但要使用调用程序的连接。

如果一般来说,如何从DLL中使用调用程序中的对象?

来自SW。 Minotavr。



evvcom   (2003-04-09 09:34) [1]

请参阅http://delphimaster.net/view/1-1049860557/上的回答。也许这会有所帮助。



Minotavr   (2003-04-09 17:09) [2]

感谢您的答复。
但它没有帮助。

Sharemem - 已经拼写出来了。
DLL - 在主窗体完成时卸载。

我也尝试过这样的事情:

DLL:
瓦尔
BASESAAE:^ TIBDatabase;
....

程序createdllform(testdb:TIBDatabase);
...

BASESAAE:= @ testdb

各种变化

我达到的最大值是“没有这样的表”这样的错误

但是有些属性可以工作,例如:

标题:= BASESAAE ^ .datebasename

或类似的东西

来自SW。 Minotavr



evvcom   (2003-04-10 02:27) [3]

我做了同样的话题......
在这里http://delphimaster.net/view/1-1049860557/看了吗?



falcon_k   (2003-04-10 02:35) [4]

我有以下结构

在DLL中

程序....(ddd:整数)
...
VAR
DB:TIBDatabase;
...
DB:= TIBDatabase(ddd);
...
Query1.Database:= DB;

在主程序中
qqq:=整数(指针(DM.DB))
将qqq传递给dll



evvcom   (2003-04-10 02:46) [5]

我明白TIBDatabase是一个类吗? 然后构造^ TIBDatabase和BASESAAE:= @ testdb是多余的,即 在过程createdllform(testdb:TIBDatabase)中 - 已经传递了指向该对象的指针,并且不必要的寻址/转发只会混淆。
这就是为什么这不起作用的原因。 我已经写过,exe中的类TIBDatabase和dll中的TIBDatabase是完全不同的类,尽管它们具有相同的代码! 即 对数据和真实处理程序在exe文件中的对象的引用传递给dll,并且dll尝试使用代码位于dll中的类的方法处理此对象! 在dll里面进行初步检查: 如果testdb是tibdatabase 取值为False,内部为exe:True。 有区别感觉?



evvcom   (2003-04-10 08:14) [6]

对于falcon_k:然而有必要将其视为反汇编程序。 如果调用了exe-module的类方法,那么一切都是正常的(我强烈怀疑),如果在dll中调用类方法(很可能就是这种情况),那么这样的构造暂时会起作用,并且当它开始出现意外时,没有人事先知道。 但是当它开始时,你将打破整个头部,这是什么问题,它昨天工作,今天运行!



jack128   (2003-04-10 09:17) [7]

evvcom©(10.04.03 08:14)


>我已经在exe和TIBDatabase中编写了类TIBDatabase
> dll是完全不同的类,尽管它们都是相同的
>代码! 即 传递给dll对象引用,其数据
>和真正的处理程序在exe文件中,并且dll尝试
>使用其代码类的方法处理此对象
>在于dll!

代码是相同的,它不在Dll或EXE中,但在包中..

从上次讨论开始

>虽然有运行时包,即使没有它们。 否则,这样的dll只能从编译在相同版本的Delphi中的exe调用!

这是一个假设还是事实证明?



evvcom   (2003-04-10 10:16) [8]

什么该死的包裹! 我们正在谈论完成的程序exe和DLL。 而不是关于.dcu .bpl .dcp等 已经从所有这些运行时或设计时包中编译的现成代码。 这个包本身(让它是运行时),它的代码包含在exe文件和dll文件中的程序集之后。 而不是它不是一个假设。 当我几年前第一次在dll中传递链接到某些基类的后代对象时(TWinControl似乎,但这并不重要),我自己犯了一个大错。 然后在dll检查 如果Sender是TEdit那么...; 如果Sender是TComboBox那么...; 等等 结果,Sender原来不是TEdit而不是TComboBox,尽管它传输的确如此。 我在一个反汇编程序中开始这项业务观察,我在这里意识到我的错误,该类似乎是一个,但事实证明2实例在他们的记忆中,但 is 它使用地址TEdit,TComboBox等检查他和他父母的类链中的Sender类的地址是否相等。
结论:如果不希望长时间修补错误,那么我不建议将类传递给dll并在那里处理它们。 我们必须将自己局限于简单的数据结构。



jack128   (2003-04-10 22:41) [9]

嗯..我试过DLL“ke check抗议课 - 原来这个按钮是Tform ......



Fantasist.   (2003-04-11 01:47) [10]


>这是包本身(让它成为运行时),它的代码在之后
>在exe文件和dll文件中组装


这个运行时间之后是什么? 运行时就是它的运行时,它的代码应该在程序执行时加载,而不是在链接阶段加载。 否则,它附加到通常的静态链接。


>如果你不想长时间乱搜寻错误,
>我只是不建议将类传递给dll和那里
>处理它们


我不建议推荐RTTI。 在VCL中,它在很高的水平,在我看来,没有使用,这意味着你只能自己带来问题。
确实,当用于编译dll的代码与编译文件的代码不同时,可能存在流行的版本兼容性问题(“dll hell”)。 部分地,可以通过使用和传递不是对象本身,而是通过它们的接口来防止它。



evvcom   (2003-04-11 08:17) [11]

梦想家:
这个运行时间之后是什么? 运行时就是它的运行时,它的代码应该在程序执行时加载,而不是在链接阶段加载。 否则,它附加到通常的静态链接。
它从哪里加载? 制作这个exe,转移它 在另一台机器上运行。 只是不要使用任何额外的dll,这样的测试不需要它们。 看看它如何在没有表面上加载某种运行时代码的情况下正常工作。
运行时是在程序正常运行期间执行的代码,并以正常方式链接,即 静态。 而设计时恰恰是开发过程中发现所需的代码。 它位于文件bpl中,它们是dll结构。 但是这种情况下的所有方法都是从bpl调用的,所有组件都是这个库的对象。



Fantasist.   (2003-04-11 17:40) [12]


> evvcom©(11.04.03 08:17)


嗯......好吧,为什么你认为,使用运行时包“和一般情况?有时候建议将VCL用作运行时包。为什么?他们说编译后的代码会变小。是的,你会尝试标记在Project-> Options中,使用运行时包检查Build并进行重建。使用400 kb的执行程序将减少到60。但其余的代码在哪里消失了?包含在可执行文件中,并保留在程序开头加载的包中(正如您自己注意到的那样 - 这些都是相同的 LL),并且它们必须自然存在,其中在程序运行在计算机上。



evvcom   (2003-04-14 08:49) [13]

是的,请原谅。 我试过了,看了一下导入部分,bpl确实存在于那里。 C运行时包从来没有真正困扰 - 没有必要。 因此,我的所有推理仅适用于静态链接。
在Borland搞砸了! 理论上,使用一种或另一种链接方法不应影响代码的质量。



АлексейК   (2003-04-14 09:24) [14]

如果表格是模态的。 非模态更难一点。
procedure CreateDllForm(db:TIBDataBase,aHandle:THandle);
var MyDllForm:TMyDllForm;
开始
Application.Handle:= AHandle;
MyDllForm:= TMyDllForm。创建(应用程序);
用MyDllForm做
开始
IBQuery.DataBase:= db;
..........
的ShowModal;
结束;
FreeAndNil(MyDllForm);
结束;
当您致电时,您需要转移Application.Handle。 而且无论传递给DLL的参数是什么。



EthernalWonderer   (2003-04-14 11:14) [15]

即使为了简单起见,也可以通过“连接”释放在dll中创建表单和其他操作。
为此,从调用者导出类似的函数
函数GetDS(IntName:String):TIBDataSet; 出口; 开始 //按名称或其他方式搜索 结果:=找到MainExeDataSet; 结束;
并将DataSet“连接”到dll:
函数GetDS(IntName:String):TIBDataSet; STDCALL; 外部“mainexe.exe”; ... ExternalDataSet:= GetDS(“DATASET1”);
所以你可以“连接”任何东西。 但是你不应该在RTTY的帮助下检查“this” - 这是真的。



NVB   (2003-04-14 11:21) [16]

在FIB的情况下:

使用
...... IBase ......
....
调用ListDB(Database.Handle)
...

在DLL中

程序ListDB(DBHandle:TISC_DB_HANDLE); STDCALL;
开始
..
Database.Handle:= DBHandle;
..
结束;

PS。 在数据库属性中
DesignDBOptions [
ddoIsDefaultDatabase = False
ddoStoreConnected = False



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

论坛:“基地”;
当前存档:2003.05.01;
下载:[xml.tar.bz2];

楼上









内存:0.63 MB
时间:0.041 c
3-410
爱德华
2003-04-10 18:21
2003.05.01
如何同时做IBExpert:


9-370
PPavel
2002-07-31 08:40
2003.05.01
绘制数字


3-478
SergLight
2003-04-11 11:24
2003.05.01
分布式DB


6-671
oficer
2003-03-06 17:04
2003.05.01
确定在互联网上停留的时间


1-550
dm37
2003-04-21 09:05
2003.05.01
图像





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