对于使用Delphi创建DLL时应该遵循哪些原则在其他Delphi版本中运行良好?感兴趣的读者,本文将提供您所需要的所有信息,我们将详细讲解delphi创建dll,并且为您提供关于.Delphi7升级
对于使用Delphi创建DLL时应该遵循哪些原则在其他Delphi版本中运行良好?感兴趣的读者,本文将提供您所需要的所有信息,我们将详细讲解delphi 创建dll,并且为您提供关于.Delphi7升级到Delphi 2010、Delphi XE、Delphi XE2总结、Delphi 7使用DelphiCodeToDoc生成文档、Delphi DLL和Delphi EXE之间的回调功能、Delphi – 使用转发导出创建DLL的宝贵知识。
本文目录一览:- 使用Delphi创建DLL时应该遵循哪些原则在其他Delphi版本中运行良好?(delphi 创建dll)
- .Delphi7升级到Delphi 2010、Delphi XE、Delphi XE2总结
- Delphi 7使用DelphiCodeToDoc生成文档
- Delphi DLL和Delphi EXE之间的回调功能
- Delphi – 使用转发导出创建DLL
使用Delphi创建DLL时应该遵循哪些原则在其他Delphi版本中运行良好?(delphi 创建dll)
我在RAD2010中使用泛型功能创建了一个类,并创建了一个具有返回其实例的函数的dll.当我尝试使用BDS2006或Delphi 6使用DLL时,DLL没有按预期工作.但如果我在其他计算机上使用RAD2010,则没有问题.是否是因为使用以前的Delphi版本中没有的功能(堆栈<> stuffs?)?
对于字符串问题,我已经按照库文件中的注释指示,将ShareMem放在库首先使用子句和我的项目中.我已经将RAD2010中的borlndmm.dll复制到我使用BDS2006尝试DLL的文件夹中.它没有崩溃,但它没有预期的工作.一个函数在RAD2010环境中返回一个空字符串,它工作得很好.
再一次,我有一个问题:为了在与其他版本的Delphi兼容的DLL中封装类,应遵循哪些原则?先感谢您. (为了在没有使用OOP的情况下将函数封装在dll中,我没有为其他版本的Delphi发布).
解决方法
通过DLL进行通信的基本规则是不使用特定于Delphi的任何东西,因此没有Delphi字符串和TObject后代.但是,接口,记录和COM类型工作正常.
.Delphi7升级到Delphi 2010、Delphi XE、Delphi XE2总结
总结
以上是小编为你收集整理的.Delphi7升级到Delphi 2010、Delphi XE、Delphi XE2总结全部内容。
如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。
Delphi 7使用DelphiCodeToDoc生成文档
总结
以上是小编为你收集整理的Delphi 7使用DelphiCodeToDoc生成文档全部内容。
如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。
Delphi DLL和Delphi EXE之间的回调功能
我想得到一些支持如何正确实现DLL中的回调函数.我可以继续,直到分配从EXE传递的回调函数,但我知道如何从DLL本身启动调用.
这是定义部分(由EXE和DLL使用):
uses Windows; Type PTCallBackStruct = ^TCallBackStruct; TCallBackStruct = packed record Handle: THandle; Caller: Pointer; FileSize: LongInt; end; type TFunctionPointerType = function(ZCallbackRec: PTCallBackStruct): Longbool; stdcall; type PTDLLParamaters = ^TDLLParamaters; TDLLParamaters = packed record Handle: THandle; Caller: Pointer; CallbackFunction: TFunctionPointerType; end; var DLLCallback: TFunctionPointerType;
EXE文件:
uses .... type function DLL_Callback(ZCallBackRec: PTCallBackStruct): LongBool; stdcall; forward; implementation function DLL_Callback(ZCallBackRec: PTCallBackStruct): LongBool; stdcall; begin // progress reporting this function should be called back from //the DLL. The Handle and Self parameter should help with identifying // which object initiated the callback end;
通过PTDLLParameters从Delphi exe传递给DLL如下:
// init callback DLLParameters := Allocmem(SizeOf(TDLLParamaters)); with DLLParameters^ do begin Handle := Application.Handle; Caller := Self; CallbackFunction:= DLL_Callback; end;
加载DLL
..... .....
调用DLL
CompressionCreateLibrary(DLLParameters); ....
某些操作
Free DLL .... ..... FreeMem(DLLParameters);
DLL文件:
应该从DLL的某个部分调用此函数,使进度回到EXE关于实际操作:
function CallCallBackFromDLL(Size: integer): Integer; begin // .... set up callbackstruct .... // calling back DLLCallback(CallbackStruct); end;
我认为这部分应该没问题:
// main init call assigning the callback function to the DLL function CompressionCreateLibrary(DLLParametersID: PTDLLParamaters): Integer; begin DLLParametersID.CallbackFunction:= @DLLCallback; end;
请帮我解释如何在DLL中正确实现回调部分.一些示例代码将不胜感激.虽然debuging初始化工作正常,但是回调失败了.先感谢您.
解决方法
DLLParametersID.CallbackFunction:= @DLLCallback;
交换那些以分配DLLCallback.
Delphi – 使用转发导出创建DLL
#pragma comment(linker,"/export:TestFunc=Real_Lib.dll.TestFunc")
或者 – 使用.def文件:
EXPORTS TestFunc=c:/Real_Lib.dll.TestFunc
(注意缺少参数或返回类型).
例如 – 在DependencyWalker for kernel32.dll中 – 您可以看到:
问题: – 你能在Delphi中实现类似的DLL结果吗? (必须使用CLI编译器才行..)
基本上,想法是生成仅包含某些函数的DLL包装器,并转发其余的函数 – 无需为所有导出的函数创建存根加载器(使用参数,返回类型等).
注意:
我知道你实际上可以省略导出函数的方法参数,这些参数指的是import = big improvement ..
但仍需要指定正确的方法类型(过程/函数),返回类型(用于函数)和调用约定.
样本(TestProgram – > Forwarder – > Real_DLL):
真正的DLL文件 – 只是你的常规DLL:
library Real_Lib; function TestFunc(a,b: Integer): Integer; stdcall; begin Result := a+b; end; exports TestFunc; begin end.
转发器DLL – “转发”导出的函数到静态导入:
library Forwarder; function TestFunc: Integer; stdcall; external 'Real_Lib.dll'; exports TestFunc; begin end.
=注意参数可以被省略.
但是 – 仍然需要指定函数返回类型.
测试程序 – 使用转发器DLL:
program TestProgram; {$APPTYPE CONSOLE} function TestFunc(a,b: Integer): Integer; stdcall; external 'Forwarder.dll'; begin Writeln('Result: ',TestFunc(2,7)); Readln; end.
=这个编译和工作:结果:9.
虽然DependencyWalker将其显示为仅调用导入函数的常规导出:
并生成这些操作码:
00403E82 . E8 7DFFFFFF CALL <JMP.&Forwarder.TestFunc> 00403E04 $- FF25 20614000 JMP DWORD PTR DS:[<&Forwarder.TestFunc>] ; Forwarde.TestFunc 00383810 F>- FF25 08613800 JMP DWORD PTR DS:[<&Real_Lib.TestFunc>] ; Real_Lib.TestFunc
那么 – 在Delphi中转发一些只有C/C++编译魔术还是可能的呢?
解决方法
我们今天的关于使用Delphi创建DLL时应该遵循哪些原则在其他Delphi版本中运行良好?和delphi 创建dll的分享就到这里,谢谢您的阅读,如果想了解更多关于.Delphi7升级到Delphi 2010、Delphi XE、Delphi XE2总结、Delphi 7使用DelphiCodeToDoc生成文档、Delphi DLL和Delphi EXE之间的回调功能、Delphi – 使用转发导出创建DLL的相关信息,可以在本站进行搜索。
本文标签: