zoukankan      html  css  js  c++  java
  • Delphi无法正确动态调用C++ dll库的几个原因

    本文说明delphi调用C++DLL库的几个问题,并给出解决方法。

    问题一:delphi找不到dll中的函数,出现“无法定位程序输入点”的问题,如下图所示。

    分析:这是因为dll库开放的函数名和代码中的函数名不致导致的,比如myfunc的函数名生成dll后变为_myfunc@12之类的问题,查看dll接口名可用depends工具。

    解决方法:①使用传统的模块定义文件 (.def);

                  ②使用extern "C"注明接口函数;

                  ③使用stdcall注明接口函数

                  详见: http://www.cnblogs.com/fishseewater/archive/2010/10/05/1844292.html 

    问题二:依赖DLL库找不到,比如vcruntime140.dll或vcruntime140.dll

    原因:使用VS生成DLL库,如果未使用release生成dll,且采用MD的方式会依赖VS自身的DLL,导致第三方使用出问题。

    解决方法:①将生成方式由Debug改为release;

                  ②生成dll的项目设置由MD改为MT。

                   详见:https://msdn.microsoft.com/zh-cn/library/2kzt1wy3.aspx 

    问题三:delphi调用函数时参数传入有误,比如传如字符串在DLL中与delphi不同

    分析:这和函数参数的入栈方式有关,跨语言最好采用stdcall

    解决方法:①将dll接口函数设置为stdcall;

                  ②DELPHI调用函数声明时也要注明stdcall,如下

                      myfunc: Function(cs:pchar):integer;Stdcall;

    问题三:delphi的函数指针在dll中调用出错

    分析:原因不明,笔者经历中,如以下代码,setCallback函数声明为

    setCallback: Function(backfunc: PbackFunc):Pointer;

             则DLL中无法正常调用回调,如果将setCallback函数声明改为

    setCallback: PbackFunc;

             则DLL中可以正常调用。

    type
     PbackFunc = procedure(message1:pchar); Stdcall;
    
    procedure handle_message(const pardata:pAnsiChar);stdcall;
    begin
    showmessage(pardata);
    Sleep(1000);
    exit;
    end;
    
    //setCallback: Function(backfunc: PbackFunc):Pointer;
    setCallback: PbackFunc;
    
    setCallback(@handle_message);

             

  • 相关阅读:
    [转]ExtJS之遍历Store
    [转]Ext ComboBox 默认选中某一项
    [转]extjs render 用法介绍
    [转]Extjs combo数据绑定与获取
    [转]ExtJs:xtype的含义
    java 使用POI批量导入excel数据
    面临读研,找工作杂感
    二维“有序”数组查找问题的解决
    操作系统——进程调度之短进程优先
    阶乘相关问题
  • 原文地址:https://www.cnblogs.com/ycloneal/p/5715537.html
Copyright © 2011-2022 走看看