精华内容
下载资源
问答
  • 动态调用的一般思想为,先LoadLibrary那个你想加载的DLL,然后通过GetProcAddress这个API获取导出函数的地址,赋值给函数指针就可以调用了,这种方式灵活性更高。所有语言都适用。 静态调用就是一般生成DLL会有个...

    DLL一定是要C语言导出的符号,也就是extern “C”。 当然,我们都知道DLL调用分为动态调用和静态调用。

     

    动态调用的一般思想为,先LoadLibrary那个你想加载的DLL,然后通过GetProcAddress这个API获取导出函数的地址,赋值给函数指针就可以调用了,这种方式灵活性更高。所有语言都适用。

     

    静态调用就是一般生成DLL会有个导入库(import library)。这个编译器要调用该DLL,用链接静态库的方式链接这个导入库就可以了。

     

    其实Delphi也是用了动态调用的方式,那种方式像之前C#调用DLL写的注解一样,隐含的实现了LoadLibrary GetProcAddress的功能,接口文件如下:

     1 unit YDJYInterface;
     2 
     3 interface
     4 
     5 // 接口初始化
     6 function YDJYDLLINIT(HospitalNoIn :  PChar; errmsgOut : PChar): Integer; stdcall;
     7 //操作员签到
     8 function SIGNIN(OperatorNoIn : PChar; SenderSerialNoIn : PChar; ReceiverSerialNoOut : PChar;
     9           OutputData : PChar) :  Integer; stdcall;
    10 //操作员签退(隐含操作员对账)
    11 function SIGNOUT(OperatorNoIn : PChar; BusiCycleNoIn : PChar;
    12                 CheckAccInfoIn : PChar; SenderSerialNoIn : PChar;
    13                 ReceiverSerialNoOut : PChar; OutputData :PChar) : Integer; stdcall;
    14 ////小查询类(只查省中心)
    15 function CenterQuery(TransCodeIn : PChar; InputData : PChar;
    16                       OutputData : PChar) : Integer; stdcall;
    17 
    18 //路由转发类+交易运算类交易入口(查询参保地)
    19 function RouteRepeater(TransCodeIn : PChar; InsuredAreaNoIn : PChar;
    20                       PersonNoIn : PChar; InputData : PChar; OutputData : PChar) : Integer; stdcall;
    21 
    22 //读卡查询
    23 function SIReadCard(OutputData : PChar) : Integer; stdcall;
    24 
    25 //卡操作函数(修改密码等)
    26 function ModifyPassword(errmsgOut : PChar) : Integer; stdcall;
    27 
    28 //通用业务处理
    29 //rtncode =  0 交易成功
    30 //          -1 交易失败
    31 //          -2 交易失败,需要冲正
    32 function YDJYBusiness_Handle(TransCodeIn : PChar; SenderSerialNoIn : PChar; PersonNoIn : PChar; 
    33     SICardNoIn : PChar; InsuredAreaNoIn : PChar; OldTransCodeIn : PChar; 
    34     OldSenderSerialNoIn : PChar; OperatorNoIn : PChar; BusiCycleNoIn : PChar;    
    35     InputData : PChar; ReceiverSerialNoOut : PChar; OutputData : PChar) : Integer; stdcall;
    36 
    37 //批量结算信息下载
    38 function BatchDownload(TransCodeIn : PChar; OperatorNoIn : PChar; BusiCycleNoIn : PChar;
    39                                  InputData : PChar; OutputData : PChar) : Integer; stdcall;
    40 
    41 
    42 //处方进队
    43 procedure FormularyEnQ(prescriptionIn : PChar); stdcall;
    44 //批量处方上传
    45 function BatchUpload() : Integer; stdcall;
    46 //转换函数
    47 function Conversion(TtemTypeIn : PChar; OldItemIn : PChar) : PChar; stdcall;
    48 //输入个人编码查询个人基本信息
    49 function SIReadPNOInfo(PersonNoIn : PChar; OutputData : PChar) : Integer; stdcall;
    50 
    51 implementation
    52 
    53 function YDJYDLLINIT; stdcall; external 'YDJYInterface.dll' name 'YDJYDLLINIT';
    54 function SIGNIN; stdcall; external 'YDJYInterface.dll' name 'SIGNIN';
    55 function SIGNOUT; stdcall; external 'YDJYInterface.dll' name 'SIGNOUT';
    56 function CenterQuery; stdcall; external 'YDJYInterface.dll' name 'CenterQuery';
    57 function RouteRepeater; stdcall; external 'YDJYInterface.dll' name 'RouteRepeater';
    58 function SIReadCard; stdcall; external 'YDJYInterface.dll' name 'SIReadCard';
    59 function ModifyPassword; stdcall;  external 'YDJYInterface.dll' name 'ModifyPassword';
    60 function YDJYBusiness_Handle; stdcall; external 'YDJYInterface.dll' name 'YDJYBusiness_Handle';
    61 function BatchDownload; stdcall; external 'YDJYInterface.dll' name 'BatchDownload';
    62 procedure FormularyEnQ; stdcall; external 'YDJYInterface.dll' name 'FormularyEnQ';
    63 function BatchUpload; stdcall; external 'YDJYInterface.dll' name 'BatchUpload';
    64 function Conversion; stdcall;  external 'YDJYInterface.dll' name 'Conversion';
    65 function SIReadPNOInfo; stdcall;  external 'YDJYInterface.dll' name 'SIReadPNOInfo';
    66 
    67 end.

     

     注意,DLL实现的调用约定要与这个接口文件的保持一致,比如都是stdcall的方式。

    references:

    https://www.cnblogs.com/westsoft/p/5935741.html

    https://blog.csdn.net/mycoolme5/article/details/51144693

    https://stackoverflow.com/questions/10405991/calling-functions-from-a-c-dll-in-delphi

    转载于:https://www.cnblogs.com/foohack/p/8776382.html

    展开全文
  • 自定义个函数读取excel文档工作表5放到listbox中࿰c;通过读取的数据再找对对应0-4工作表的数放到label中࿰c;在设置函数变量时不知输出变量要怎么设࿰c;如想取fpas,fpbeg,fpend,fdan....等数࿰c;...
  • 工具:(BCB6 + delphi7) 1.BCB 调用 delphi的 pas单元.    最简单的是直接添加,然后编译器会自动生成头文件,调用即可。 2.delphi 调用 bcb .  delphi能够直接调用 BCB编译 c文件生成的OBJ文件.  注

    Delphi共享c++的函数过程使用心得..

    似乎这方面的资料很少,研究了一阵子,终于有了一些确定性的结果。工具:(BCB6 + delphi7)

    1.BCB 调用 delphi的 pas单元.
      
       最简单的是直接添加,然后编译器会自动生成头文件,调用即可。

    2.delphi 调用 bcb .

       delphi能够直接调用 BCB编译 c文件生成的OBJ文件.

       注意,这里是 C文件....其它编译器自动生成的Unit单元文件编译出来的obj并不能够识别。

       想生成delphi可调用的obj,必须是在BCB中使用新建C文件,然后新建头文件的方法。
      
    例子:

       h文件中

    #ifndef BCBFileH
    #define BCBFileH

    #pragma pack(push, 1)

    #ifdef __cplusplus
    extern "C" {
    #endif
    extern double _stdcall CallBcbFun(double x,double y);

    #ifdef __cplusplus
    }
    #endif

    #pragma pack(pop)

    #endif

    //--------------------------------------------

    c文件内容

    #include "BCBFile.h"

    double _stdcall CallBcbFun(double x,double y)
    {
       double v=(x>y?x:y);
       return v;
    }

    //---------------------------------------------

    delphi 中可以如此调用

    implementation
    function CallBcbFun(const x:Real; const y:Real):Real;stdcall;external;{$LINK 'TestBCBFile.obj'}
    ...

      
    procedure TForm1.btn1Click(Sender: TObject);
    var
        x,y:Extended;
    begin
       x:= CallBcbFun(1,60);
       ShowMessage(FloatToStr(x)); //输出60
    end;

    //-----------------------------------------------

    通过以上方法。很多过程或者说很多成熟的c单元就可以直接使用了...代码手工转换过程一去不复返....^O^.

    展开全文
  • 事情源于有个客户需使用我们... 我们C++中间件动态库的接口函数声明: extern "C" bool __stdcall ExecuteTaskInFile(const char *szTaskID, const char *szInputFil...

      事情源于有个客户需使用我们C++的中间件动态库来跟设备连接通讯,但是传入以及传出的字符串指针格式都不正确(出现乱码或是被截断),估计是字符编码的问题导致。以下是解决问题的过程:
      我们C++中间件动态库的接口函数声明:

    extern "C" bool __stdcall ExecuteTaskInFile(const char *szTaskID, const char *szInputFile, const char *szOutputFile, bool bSynch);
    

    传入的字符串指针要求是Ansi编码。
      我们给客户提供的Delphi例子是用Delphi7写的:
    声明:

    function ExecuteTaskInFile(szTaskID : Pchar; szInputFile:Pchar; szOutputFile:PChar; bSynch :boolean):boolean;stdcall;external 'XXXX.dll';
    

    调用:

    function ExecuteFileTask():boolean;
    
    var
    
    strTaskID:string;
    
    begin
    
    	//略去若干注释
    	
    	strTaskID := '20160222111817081';
    	
    	Result := ExecuteTaskInFile(pchar(strTaskID), pchar('C:\Data\TestData\Input\Task.xml'),pchar('C:\Data\TestData\Output\TaskResult.xml'), true);
    
    end;
    

      但是该程序拿到客户处编译运行后出现一些莫名错误,据客户反馈,他们也是使用Delphi,因此怀疑方向一度转到传入的数据文件内容是否有错误上,但从客户处取回数据文件后测试也无问题。不得已,只能上门拜访了下客户,幸好不是很远。到了现场才得知用户使用的Delphi是Delphi XE7,已经是Borland将Delphi抛弃很多年以后的事情了,距离我使用过的Delphi7也已经是12年后了。
      在客户现场查看动态库接口的日志,发现了如下的记录:
    2018-10-15 13:28:14,318 [0x000012c0] INFO RUNNING 0 XXXX.XXXX Enter XXXX::ExecuteTaskInFile(TaskId:2)
    而我们传入的TaskId其实是’20160222111817081’,只取到了第一个字符,那么很有可能是传入的指针指向的字符串是使用Unicode编码的,其第二个字节是0x00被当作字符串结束符而截断了。
      很多年没有关注Delphi,又回顾了下Delphi的历史,Delphi7还是Ansi编码的IDE,因此上面的代码调用C++动态库传入Ansi字符串没有问题, 而Delphi从2009开始完整正式支持Unicode,之后的XE7是2014年发布的。 Delphi在2009以后对应char*的类型为PWideChar,因此默认使用了Unicode编码,如果要用Ansi编码,必须是PAnsiChar。
      这样看来,问题就简单明了了,将Delphi代码改成如下后测试通过:
    声明:

    function ExecuteTaskInFile(szTaskID : PAnsichar; szInputFile:PAnsichar; szOutputFile:PAnsiChar; bSynch :boolean):boolean;stdcall;external 'XXXX.dll';
    

    调用:

    function ExecuteFileTask():boolean;
    
    var
    
      strTaskID:string;
    
    begin
    
        strTaskID := '20160222111817081';
    
        Result := ExecuteTaskInFile(pAnsichar(AnsiString(strTaskID)), pAnsichar('C:\Data\TestData\Input\Task.xml'), pAnsichar('C:\Data\TestData\Output\TaskResult.xml'), true);
    
    end;
    

      值得注意的是,当使用字符串变量传递时,必须加以AnsiString转换,而常量字符串参数则可不用,后面再仔细研究了。
      总结:其实事情本不复杂,可以通过简单的沟通就了解到客户的使用场景以及动态库的调用日志然后做针对性的分析,但是我们常常会忽略一些细节从而做出一些片面的判断导致问题复杂化,遇到问题时按部就班,不放过一个细节,针对性的分析解决才是正确的做法。
      忌 一叶蔽目,管中窥豹。
      宜 审问慎思,明辨笃行。

    展开全文
  • 以上代码是DelPhi7 中定义的动态数组 其提供一个函数如下 int Mzsfgl(int lb,Tsf* sf,Toutput* output);stdcall; 我在VB中这样调用 Public Declare Function mzsfglc Lib "yyjk.dll" (ByRef Lb As String, tsf() ...
  • 每次调用这个函数获取的网页内容都和第一次时调用的内容一模一样。但是网页的内容实际已经更新了。 我发现第一次get https时有延迟说明有是获取的https链接的内容࿰c;从第二次开始get就没有延迟了࿰c;好像...
  • OS: WINXP WIN7 WIN8 WIN10 支持各大浏览器 Google Chrome Mozilla Firefox Internet Explorer 8-11 ...可以导出标准C函数DLL供任何语言调用 也可以导出标准C函数DLL供任何语言调用 也可以给代码集成到自己工程当
  • 23 Delphi_c.htm 在Delphi与C++之间实现函数与对象共享 7K 24 Delphi_err.htm Delphi编译错误中文手册 34K 25 Delphi_net1.htm DELPHI与INTERNET 34K 26 Delphi_net2.htm DELPHI与INTERNET 46K 27 Delphi_...
  • Delphi5开发人员指南

    热门讨论 2012-07-18 16:51:14
    1.3.4 Delphi 4 7 1.3.5 Delphi 5 7 1.3.6 未来 7 1.4 Delphi 5的IDE 7 1.4.1 主窗口 8 1.4.2 窗体设计器 9 1.4.3 Object Inspector 9 1.4.4 代码编辑器 9 1.4.5 代码浏览器 10 1.4.6 源代码生成器 10 1.5 创建一个...
  • 2、 Delphi2007支持Vista界面,封装了Vsita的新API函数。 3、 Delphi2007有一个功能很有意思,支持D2006的所有BPL组件。意思是,如果你用D2006编译过的BPL,没有源码和DCU,也可以直接安装在Delphi2007。哈哈,这...
  • Draw列表框\r\n6.11 通过DLL调用回调函数\r\n6.12 共享不同进程中的DLL数据\r\n6.12.1 创建共享内存的DLL\r\n6.12.2 使用共享内存的DLL\r\n6.13 从DLL中输出对象\r\n6.14 小结\r\n\r\n第三部分 数据库开发\r\n\r\n第...
  • Draw列表框\r\n6.11 通过DLL调用回调函数\r\n6.12 共享不同进程中的DLL数据\r\n6.12.1 创建共享内存的DLL\r\n6.12.2 使用共享内存的DLL\r\n6.13 从DLL中输出对象\r\n6.14 小结\r\n\r\n第三部分 数据库开发\r\n\r\n第...
  • c、DLL函数的导出与调用 3-3-2、编写代码: 键盘勾子HOOK 3-3-3、编写代码: 注入DLL(带窗口)至游戏 3-4、用OD分析游戏功能CALL-《武林外传》为例 2-4-1、 吃红(补血) 2-4-2、 吃蓝(补魔) 2-4-3、 选怪...
  • Delphi基于Ring0技术读写Windows系统下的硬盘物理扇区,磁盘读写操作一例,包括了VxD和仿CIH两种方法,VxD方法中还包括了所调用控件的VC 源代码,并且包括了一个测试的例子,运行效果如演示截图所示。相关的源代码...
  • c、DLL函数的导出与调用 2-3-2、编写代码: a、键盘勾子(HOOK) b、回调函数 2-3-3、编写代码: a、DLL中建立窗口 b、构建外挂界面 c、注入带窗口的DLL 至游戏 2-3-4、编写代码: a、 F1-F8Call测试代码 ...
  • Delphi / C ++ Builder IDE。该程序创建文件夹以保持EhLib二进制 和其他重新整理的文件,将重新整理的文件复制到创建的文件夹, 编译程序包,在IDE中注册程序包并编写重新格式化的路径 在注册表中。 如果您具有可...
  • 理线程调用执行,否则必须调用RCSAppGetEvent函数得到Client的请求 应答ID,然后通过应答ID取参数和设置返回值等等操作,这时处理应答由外部程 序自己处理; 7. Fields类主要负责数据库字段值的组包和拆包,以及...
  • 理线程调用执行,否则必须调用RCSAppGetEvent函数得到Client的请求 应答ID,然后通过应答ID取参数和设置返回值等等操作,这时处理应答由外部程 序自己处理; 7. Fields类主要负责数据库字段值的组包和拆包,以及...
  • ODAC 9.2 D7

    2014-05-12 16:07:37
    ODAC 直接使用 Oracle 调用接口 OCI OCI 是一种允许应用程序开发人员使用第三方开发语言存取Oracle数据服务器的过程或函数以及控制所有的SQL语句执行状态的应用程序接口(API) OCI 通过一个动态运行库(ORA DLL)...
  • SourceFormatXCrack.7z

    2011-11-27 16:39:07
    其可以按照预设或自定义的源码风格全自动、大批量、精细地美化 C, C++, Java, C#, D Language, Pascal (Delphi), Visual Basic, VB.NET, VBScript, JavaScript (JScript), PHP, ASP, JSP, HTML, XML, ...
  • C. "搜索结果.取子匹配文本"命令的“子表达式索引”参数改为通用型,支持传递命名分组参数。 D. 修复“用来匹配的文本”参数为“”导致的错误。 E. 增加“命名分组测试”例程 2015.10.8日更新: 25. 支持库的...
  • HP-Socket v3.1.1 正式版

    热门讨论 2013-12-25 11:08:43
    2.导出纯 C 函数,让其它语言(如:C/C#/Delphi 等)能方便地使用 HPSocket 3.HPSocket4C.dll 使用方法 方法一: ------------------------------------------------------------------------------ (0) (C/C++ ...
  • 精通matlab7.0混合编程.

    2015-06-30 09:21:20
    8.5.2 visual c++工程中调用matlab数学函数库的环境设置 8.6 小结.. 第9章 通过matlab add-in实现混合编程 9.1 matlab add-in简介 9.2 matlab add-in安装和在visual c++中的环境设置 9.3 通过matlab add-in生成独立...
  • •集成脚本之间双向调用桥接,任何语言 c/c++, lua, python, java, c#,ruby可以直接存取和调用其它语言中的类,函数,方法,以及模块 •支持丰富的网络功能: tcp/udp, telnet server, http server, soap server. •...
  • D5开发人员指南-03卷

    2011-09-27 13:14:48
    13.5.1 调用一个函数 416 13.5.2 命名问题 417 13.5.3 共享数据 417 13.5.4 使用Delphi RTL 418 13.6 使用C++类 422 13.7 替换 426 13.7.1 generic替换 426 13.7.2 WM_COPYDATA 435 13.8 获取包的信息 440 13.9 总结...
  • understand破解版——程序分析利器

    热门讨论 2012-07-03 12:35:26
    1、支持多语言:Ada, C, C++, C#, Java, FORTRAN, Delphi, Jovial, and PL/M ,混合语言的project也支持 2、多平台: Windows/Linux/Solaris/HP-UX/IRIX/MAC OS X 3、代码语法高亮、代码折迭、交叉跳转、书签等基本...
  • Understand功能完美强大: 1、支持多语言:Ada, C, C++, C#, Java, FORTRAN, Delphi, Jovial, and PL/M ,混合语言的project也支持 2、多平台: Windows/Linux/Solaris/HP-UX/IRIX/MAC OS X 3、代码语法高亮、代码...
  • 纯商业代码,可以快速应用集成到 工程当中 !绝非发送键盘消息山寨方法!!!!!!! 运行后热键为CTRL+ALT+C...可以导出标准C函数DLL供任何语言调用 也可以给代码集成到自己工程当中。 ////////////////////////////////////
  • 数学算法原书光盘

    2012-03-15 22:56:13
    做完以上的准备工作后,然后配合书中的说明,在Delphi系统下直接调用D:\DELPHI_SHU 下或光盘中以V开头的子目录中的工程,按运行键,即显示计算结果,从而可迅速,方便地使 用该算法。达到事半功倍的效果。 3、...

空空如也

空空如也

1 2 3 4
收藏数 78
精华内容 31
关键字:

delphi7调用c函数