首先创建一个DLL文件,项目自带的代码为:

library ProjectPnr;

{ Important note about DLL memory management: ShareMem must be the
first unit in your library's USES clause AND your project's (select
Project-View Source) USES clause if your DLL exports any procedures or
functions that pass strings as parameters or function results. This
applies to all strings passed to and from your DLL--even those that
are nested in records and classes. ShareMem is the interface unit to
the BORLNDMM.DLL shared memory manager, which must be deployed along
with your DLL. To avoid using BORLNDMM.DLL, pass string information
using PChar or ShortString parameters. } uses
SysUtils,
Classes, //再在Uses下声明一个函数:
function Add(a, b: integer):integer; // 函数功能 实现a,b相加
begin
result := a + b;
end exports add; // 必须要有这句才能输出 begin
end.

这样一个简单的dll就创建成功了,保存为test,建议最好把建好的dll放在和调用项目放在一起,

接下来就是调用了,调用很简单:

新建一个application,在implementation上面引用刚刚写的dll函数:

function apnr(a,b: integer):integer; external 'test.dll';

这里注意,大小写要和dll里的函数一样。

放一个按钮,在OnClick事件中调用dll里函数就行。

procedure TForm2.Button1Click(Sender: TObject);
begin
ShowMessage(add(1, 2)); //3
end;

但是当返回值是string时,调用会报指针内存错误,比如说:(至少在delphi7里)

//dll里函数
function add(a, b: integer): string;
begin
result := IntToStr(a + b);
end;

解决方法:

将返回值string改成PChar,就可以调用了,应该是dll的处理string和application处理string的方法不一样吧。

然后我将用XE打开刚刚调用dll的项目,发现直接闪退,我在用D7打开这个项目,结果有返回值,

这种现象是因为D7的PChar长度是单字节,而XE的PChar长度是双字节,具体用SizeOf测试,D7用的是Ansi编码,XE用的时Unicode编码,

解决方法

把PChar改成PAnsiChar或PWideChar。

为了兼容,最好把dll要返回的string变成PAnsiChar。

delphi 创建DLL文件 及其调用和注意事项的更多相关文章

  1. C# 创建Dll文件供程序调用方法

    C# 创建Dll文件供程序调用方法 使用C#创建动态Dll文件方法: 1.  在VS2017环境下,新建-项目-选择类库类型: 2. 新创建一个.cs文件(如test.cs),编写代码如下: usin ...

  2. 在VS2015中用C++创建DLL并用C#调用且同时实现对DLL的调试

    from:http://m.blog.csdn.net/article/details?id=51075023 在VS2015中先创建C#项目,然后再创建要编写的动态库DLL项目,这样做的好处是整个解 ...

  3. 在VS2015中用C++创建DLL并用C++调用且同一时候实现对DLL的调试

    一:用C++创建DLL            依照[在VS2015中用C++编写可被其他语言调用的动态库DLL]提示创建C++编写的DLL.或參考[在VS2015中用C++创建DLL并用C#调用且同一 ...

  4. vs工程生成dll文件及其调用方法

    转载:https://blog.csdn.net/weixin_44536482/article/details/91519413 vs工程生成dll文件及其调用方法                  ...

  5. c++ 生成dll文件并调用-转

    .h(头文件) .lib(库文件) .dll(动态链接库文件) 之间的关系和作用的区分   .h头文件是编译时必须的,lib是链接时需要的,dll是运行时需要的. 附加依赖项的是.lib不是.dll, ...

  6. asp.net源程序编译为dll文件并调用的实现过程

    很多时候,我们需要将.cs文件单独编译成.dll文件,这就需要使用csc命令将.cs文件编译成.dll动态链接库文件.具体的操作步骤如下: 打开命令窗口->输入cmd到控制台->cd C: ...

  7. 利用C++创建DLL并C#调用

    日期:2018年11月26日 环境:window 10,VS2015 community 一.利用C++创建DLL 1.新建项目: 2.打开CreateDLL.cpp文件,并输入测试代码 #inclu ...

  8. 如何创建DLL文件

    动态链接库(DLL)是从C语言函数库和Pascal库单元的概念发展而来的.所有的C语言标准库函数都存放在某一函数库中.在链接应用程序的过程中,链接器从库文件中拷贝程序调用的函数代码,并把这些函数代码添 ...

  9. C#导入c++ dll报找不到dll文件 masm32调用c++类库

    最近需要在C#下调用一个c++ dll库,不管怎样dllimport就是报错找不到该dll文件,路径.函数名称.参数.dllimport参数逐个检查确认无误也无济于事,无奈想用其他语言调用试试,由于是 ...

随机推荐

  1. 学习FPGA需要做哪些

    有些人比较差,做了一些介绍,有误导成分.有些人水平太高,介绍的很好,但是很多人依旧听不懂,得到的肯定很少.学习FPGA,在不同层次的人明显有不同的答案. 熟悉硬件描述语言语法,不需要什么都会,但是要记 ...

  2. FTP,FTPS,FTPS与防火墙

    昨天搭建了一台FTPS服务器,过程中学习了很多不清楚的知识点,还有遇到的问题,记录一下. (大部分内容汇集.整理自网络) 一. 关于FTP传输模式 众所周知,FTP传输有两种工作模式,Active M ...

  3. 010. windows10下安装kivy 1.9.1版

    Microsoft Windows [版本 10.0.14393] 以管理员权限打开cmd (c) 2016 Microsoft Corporation. 保留所有权利. 1. C:\Users\LG ...

  4. 基于angularJs+ui-router+bootstrap风格的表格生成指令

    1 /** 根据参数定制表格 * api接口: * form-model:[item1,item2,item3] * form-properties:[ * {key:'',label:'',thCl ...

  5. activemq artemis安装运行及其在springboot中的使用

    安装 创建broker 在springboot中的使用 依赖 配置 Producer Consumer Rest使用 安装 http://activemq.apache.org/artemis/dow ...

  6. python web指纹获取加目录扫描加端口扫描加判断robots.txt

    前言: 总结上几次的信息收集构造出来的. 0x01: 首先今行web指纹识别,然后在进行robots是否存在.后面是目录扫描 然后到使用nmap命令扫描端口.(nmap模块在windows下使用会报停 ...

  7. 查询cad库中,所有程序leg引用的点的id,需要预先处理点表和程序表

    select f1.pro_id,f1.pro_type, f1.code_fix_point, f1.code_type_fix_point, f1.code_fir,f2.code_icao,nv ...

  8. Linq入门博客系列地址http://www.cnblogs.com/lifepoem/category/330218.html

    http://www.cnblogs.com/lifepoem/category/330218.html Linq及LambdaSql语句: http://kb.cnblogs.com/page/42 ...

  9. openGL 变换06

    变换 使用(多个)矩阵(Matrix) 对象可以更好的变换(Transform)一个物体. 向量 向量最基本的定义就是一个方向. 或者说 向量有一个方向(Direction)和大小(Magnitude ...

  10. C#获取当前站点的根地址

    /// <summary> /// 得到当前网站的根地址 /// </summary> /// <returns></returns> protecte ...