GVKun编程网logo

使用Delphi创建DLL时应该遵循哪些原则在其他Delphi版本中运行良好?(delphi 创建dll)

11

对于使用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)

使用Delphi创建DLL时应该遵循哪些原则在其他Delphi版本中运行良好?(delphi 创建dll)

在 this question之后,我需要知道应该遵循什么原则才能在与其他版本的Delphi兼容的dll中封装类.
我在RAD2010中使用泛型功能创建了一个类,并创建了一个具有返回其实例的函数的dll.当我尝试使用BDS2006或Delphi 6使用DLL时,DLL没有按预期工作.但如果我在其他计算机上使用RAD2010,则没有问题.是否是因为使用以前的Delphi版本中没有的功能(堆栈<> stuffs?)?
对于字符串问题,我已经按照库文件中的注释指示,将ShareMem放在库首先使用子句和我的项目中.我已经将RAD2010中的borlndmm.dll复制到我使用BDS2006尝试DLL的文件夹中.它没有崩溃,但它没有预期的工作.一个函数在RAD2010环境中返回一个空字符串,它工作得很好.

再一次,我有一个问题:为了在与其他版本的Delphi兼容的DLL中封装类,应遵循哪些原则?先感谢您. (为了在没有使用OOP的情况下将函数封装在dll中,我没有为其他版本的Delphi发布).

解决方法

字符串的定义随D2009而改变.如果要使字符串通信安全,请使用PAnsiChar或WideString.

通过DLL进行通信的基本规则是不使用特定于Delphi的任何东西,因此没有Delphi字符串和TObject后代.但是,接口,记录和COM类型工作正常.

.Delphi7升级到Delphi 2010、Delphi XE、Delphi XE2总结

.Delphi7升级到Delphi 2010、Delphi XE、Delphi XE2总结

总结

以上是小编为你收集整理的.Delphi7升级到Delphi 2010、Delphi XE、Delphi XE2总结全部内容。

如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。

Delphi 7使用DelphiCodeToDoc生成文档

Delphi 7使用DelphiCodeToDoc生成文档

总结

以上是小编为你收集整理的Delphi 7使用DelphiCodeToDoc生成文档全部内容。

如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。

Delphi DLL和Delphi EXE之间的回调功能

Delphi DLL和Delphi EXE之间的回调功能

我正在写一个Delphi DLL.在Delphi DLL中我想实现一个回调函数,这个回调函数应该调用回调用Delphi程序.回调函数的主要目的是在DLL中发生某些长操作,但是在调用者Delphi程序中应该进行进度报告(通过进度条)和操作取消.

我想得到一些支持如何正确实现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初始化工作正常,但是回调失败了.先感谢您.

解决方法

你的作业陈述是落后的.在DLL函数中,DLLParametersID保存有关回调的信息,但随后用全局变量覆盖它:
DLLParametersID.CallbackFunction:= @DLLCallback;

交换那些以分配DLLCallback.

Delphi – 使用转发导出创建DLL

Delphi – 使用转发导出创建DLL

在C/C++中,可以创建一个DLL,其中一些导出函数被转发到其他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无法创建此类可执行文件.如果要从Delphi创建这样的DLL,则需要执行一些后处理.

我们今天的关于使用Delphi创建DLL时应该遵循哪些原则在其他Delphi版本中运行良好?delphi 创建dll的分享就到这里,谢谢您的阅读,如果想了解更多关于.Delphi7升级到Delphi 2010、Delphi XE、Delphi XE2总结、Delphi 7使用DelphiCodeToDoc生成文档、Delphi DLL和Delphi EXE之间的回调功能、Delphi – 使用转发导出创建DLL的相关信息,可以在本站进行搜索。

本文标签: