Delphi 调用C/C++的Dll(stdcall关键字, 会导致函数名分裂. 此时函数名变成[email protected])

delphi调用C++写的Dll, 当然这个Dll要求是非MFC的Dll, 这样子才能被delphi调用. 根据C++定义函数的情况, Delphi有不同的相对应的处理方法.
1. 声明中不加__stdcall,采用VC默认格式__cdecl,但在Delphi中要注明调用格式为cdecl。
C++中例子:

[cpp] view plain copy

print?

  1. extern "C" int __declspec(dllexport) add(int x, int y);

Delphi中例子:

[delphi] view plain copy

print?

  1. function add(i:Integer; j:Integer):Integer; cdecl; External ‘NonMfcDll.dll‘;

2. 声明中加上__stdcall
C++中例子:

[cpp] view plain copy

print?

  1. extern "C" int __declspec(dllexport) __stdcall stdadd(int x, int y);

因为加上__stdcall关键字, 会导致函数名分裂. 此时函数名变成[email protected]. 其中, 8是参数的总字节数
Delphi引用的方法1: 在delphi定义中加上"name‘[email protected]‘".

[delphi] view plain copy

print?

  1. function stdadd(i:Integer; j:Integer):Integer; stdcall; External ‘NonMfcDll.dll‘ name‘[email protected]‘;

Delphi引用的方法2: 增加def文件, 内容如下

[plain] view plain copy

print?

  1. ; NonMfcDll.def : 声明 DLL 的模块参数。
  2. LIBRARY      "NonMfcDll"
  3. EXPORTS
  4. ; 此处可以是显式导出
  5. stdadd @1

delphi的定义如下

[delphi] view plain copy

print?

  1. function add(i:Integer; j:Integer):Integer; stdcall; External ‘NonMfcDll.dll‘;

http://blog.csdn.net/huang_xw/article/details/7524359

时间: 2024-08-02 07:01:43

Delphi 调用C/C++的Dll(stdcall关键字, 会导致函数名分裂. 此时函数名变成[email protected])的相关文章

发现个delphi调用vc写的Dll中包含pchar参数报错奇怪现象

发现个delphi调用vc写的Dll中包含pchar参数奇怪现象 procedure中的第一行语句不能直接调用DLL的函数,否则会运行错,在之前任意加上条语句就不报错了奇怪! vc的DLL源码地址 http://blog.csdn.net/lqena/article/details/46357165 Delphi源码如下: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Co

Delphi调用C++写的dll示例

最近做一个读市民卡的项目,读卡器公司提供的读市民卡dll是用C++写的. 下面记录一些自己的心得,供需要的朋友参考. 声明dll函数要加上stdcall关键字,否则可能会报地址非法的错误. 代码: unit cMain; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, DB, ADODB, StdCtrls, ComCtrls,ActiveX, E

Delphi调用Dll的的2种写法

unit Unit1; interface uses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs, StdCtrls;//定义类型要与原函数一样function GetUserDefaultUILanguage():Integer;external 'Kernel32.DLL'; type  TForm1 = class(TForm)    Button1: TButto

CommMonitor8.0 串口过滤驱动 SDK DLL版本 C#/Delphi调用DEMO

CommMonitor8.0 SDK DLL 版本,此版本是直接调用DLL. Delphi调用定义: constCommMOnitor8x = ‘CommMOnitor8x.dll’; typeTOnMonitorL = procedure(seq: DWORD; //序号dt: DWORD; //时间ctrl: DWORD; //控制码PID: DWORD; //进程IDcomNum: PAnsiChar; //串口号size: DWORD; //数据大小vtASC: PAnsiChar //

Delphi - Windows系统下,Delphi调用API函数和7z.dll动态库,自动把文件压缩成.tar.gz格式的文件

项目背景 应欧美客户需求,需要将文件压缩成.tar.gz格式的文件,并上传给客户端SFTP服务器. 你懂的,7-Zip软件的显著特点是文件越大压缩比越高,在Linux系统上相当于我们Windows系统上WinRAR或者好压软件一样的存在. 7-Zip软件下载与安装 网上下载相关安装包并完成安装,找到安装目录,复制7z.dll文件到D盘. .bat文件的制作 通过7-Zip软件使用手册了解到,通过动态命令行调用7z.dll可以把文件压缩成.tar.gz格式的,实际上是先将文件压缩成.tar格式的文

【转】Delphi调用webservice总结

原文:http://www.cnblogs.com/zhangzhifeng/archive/2013/08/15/3259084.html Delphi调用C#写的webservice 用delphi的THTTPRIO控件调用了c#写的webservice. 下面是我调试时遇到的一些问题: 1:导入wsdl文件:file--new----other----webservice---WSDLimporter---输入wsdl地址:如下:http://127.0.0.1/ WebService/W

Delphi调用webservice总结

Delphi调用C#写的webservice 用delphi的THTTPRIO控件调用了c#写的webservice. 下面是我调试时遇到的一些问题: 1:导入wsdl文件:file--new----other----webservice---WSDLimporter---输入wsdl地址:如下:http://127.0.0.1/ WebService/WebServiceCall.asmx?wsdl 注意末尾的:'?wsdl'不能少.要不可能会说找不到. 2:设置THTTPRIO控件的属性:

Delphi调用外部程序函数:WinExec() 和ShellExecute详解

1,WinExec(): WinExec主要运行EXE文件,不能运行其他类型的文件.不用引用特别单元. 原型:UINT WinExec(exePath,ShowCmd) 示例,我想要用记事本打开"C:\HDC.TXT",以正常方式运行:WinExec(pChar('notepad c:\taoyoyo.txt'),SW_SHOWNORMAL); 参数说明: --xePath:命令行参数.注意,要用pChar转化一下. --ShowCmd:外部程序的运行方式.其取值如下: ----SW_

那些年,用C#调用过的外部Dll

经常有人找到我咨询以前在csdn资源里分享的dll调用.算算也写过N多接口程序.翻一翻试试写篇随笔. 明华IC读写器DLL 爱迪尔门锁接口DLL 通用OPOS指令打印之北洋pos打印机dll 明泰非接触式RF读写器DLL 还有很多,以后补上.大多找不到了.也是懒得找了. 先抄点名词解释 DllImport是System.Runtime.InteropServices命名空间下的一个属性类,其功能是提供从非托管DLL导出的函数的必要调用信息. DllImport属性应用于方法,要求最少要提供包含入