Delphi开发/调用DLL
文章平均质量分 52
liangpei2008
22
展开
-
DLL调试
在调试DLL时,只要注意以下几点,一般均可以对DLL进行调试!现假设有宿主程序MyDllTest.exe与MyDLL.dll程序,要想调试MyDLL.dll,应注意以下几点: 1)MyDllTest.exe 所在目录中不能有 MyDll.dll2)MyDllTest .exe必须采用静态调用的方法调用 MyDll.dll 的导出函数3)进入 MyDll 工程,执行菜单“Run”原创 2009-04-24 22:26:00 · 827 阅读 · 1 评论 -
函数调用协议
函数调用协议指定了函数参数的传递方式以及栈管理方式。如果你这里不指定调用协议,编译器会用默认的调用协议。 结果可能和DLL 函数原先指定协议的不同,函数被调用时会直接导致程序崩溃。 Windows API 函数 GetProcAddress 被广泛用于取得函数指针地址。 我接触过的调用方式有 _cdecl , _stdcall,register _cdecl 是C语言默原创 2009-04-24 22:57:00 · 1288 阅读 · 0 评论 -
编写dll时的内存分配策略
前一篇文章介绍了为何要共用内存管理器,有人要问可不可以在编写dll时更通用一些,可以兼顾其它编译器(如果是其它编译器的话,Delphi写的dll不能与其它语言共用内存管理器),采用一定的策略来避免在dll内创建RTL自动管理的数据类型做参数或返回值,这样其它非Delphi的开发语言也可以用了!完全可以!一般的策略如下:1.在主调函数中申请一块空间2.把这个空间的地址传送给dll原创 2009-04-25 08:01:00 · 1597 阅读 · 1 评论 -
DLL的晚绑定与早绑定
调用DLL中的函数可分为早绑定与晚绑定!早绑定是指在编译期就已经确定函数地址!晚绑定是指在运行期动态加载dll,并根据查表的方式获取dll内exports函数的地址,由于早绑定比较简单,在此不再讲述,主要说晚绑定! //晚绑定,也就是动态调用外部函数主要用以下三个命令: //LoadLibrary:获取 DLL //GetProcAddress:获取函数 //FreeLibrar原创 2009-04-24 22:48:00 · 1567 阅读 · 0 评论 -
DLL何时需共享内存管理器
Delphi创建DLL时,IDE自动生成的文档中写得很清楚,当在DLL中以动态数组或String做为参数或返回值时(即RTL自动维护的数据类型),请在每个工程文件的第一个单元加上ShareMem。这样就可以使宿主程序与DLL共享内存管理器了!这样的话,在发布程序时需要把borlndmm.DLL一同发布!问题1: 为何要加到工程文件的第一个单元? 对于DLL和主原创 2009-04-24 22:32:00 · 2299 阅读 · 1 评论 -
DLL对象类型转换
以下案例代码为在dll中创建一个adodataset对象,并把它返回给主调函数 //以下代码是错误的!!!//这一节主要告诉大家,以这种方式进行开发dll是不对的以及错误原因,正确的方式是什么!//DLL内创建对象,并把对象返回function GetDataSet(str,conn:PChar): TADODataSet;stdcall; begin Result:=原创 2009-05-12 11:42:00 · 1372 阅读 · 2 评论 -
Delphi调用DLL中的接口
最近很少上论坛,这几次发现好几个问题都是围绕如何使用DLL中的接口而展开的。问题描述:具体问题就是在隐式使用接口变量后,在FreeLibrary执行后,就会出现一个非法访址的错误。这个错误的原因就是在FreeLibrary后,DLL以的代码均为不可用状态,而在代码执行完整个过程后,VCL要对RTL类型的数据进行清理。而在清理过程中肯定要对接口进行减1并进行释放相关对象。而对象代码原创 2010-03-19 08:07:00 · 12073 阅读 · 4 评论 -
Delphi中单例
//Delphi7以下均没有私有构造函数,当把构造函数写在Private中,在创建对象时,编译器会直接找到根类的Create来执行。所以一般都用NewInstance来实现单例。 NewInstance方法是在根类的Create中,只要在这个函数中判断实例是否存在,就OK了。原创 2011-07-21 10:24:14 · 905 阅读 · 0 评论