在VC Project中调用Delphi函数

时间:2013-05-30 15:14:13

标签: delphi visual-c++ dll

我在delphi中创建了一个函数,如下所示: function CheckResult():integer; stdcall; export;

编译器是Delphi 64,输出是CheckFunctions.dll

然后 在VC ++项目中(VS 2012), 我写: extern "C" __declspec(dllimport) int __stdcall CheckResult();

并在函数中使用它,然后我在C ++项目中得到编译器错误:

  

错误LINK2019:函数 *

中引用了未解析的外部符号__imp_CheckResult

我该怎么办? 感谢

3 个答案:

答案 0 :(得分:3)

您缺少DLL的导入库(.lib文件)。这就是链接器提供该错误消息的原因。不幸的是,Delphi不会生成.lib文件,这在我看来是一个弱点。

您可以通过以下任一方式解决问题:

  1. 与LoadLibrary / GetProcAddress链接。
  2. 生成合适的.lib文件。
  3. 选项2很简单。在Visual Studio中创建一个假的DLL项目。安排它导出与Delphi DLL相同的功能。使用空存根实现这些功能。使用.def文件而不是__declspec(dllexport)来避免导出的名称修饰。

    真的很明显。制作一个与真实DLL具有相同接口的假DLL。同名,功能相同。虚假的DLL不需要实现,因为你所做的只是让MS工具来制作Delphi所不能的.lib文件。

    此处有更多详情:http://support.microsoft.com/kb/131313


    FWIW我相信Delphi导出修饰符会被忽略。请改用exports子句。

答案 1 :(得分:2)

使用VC的命令行LIB实用程序为DLL创建与VC兼容的导入.lib文件,然后将该文件添加到VC项目中。

答案 2 :(得分:-1)

在设置指定方法之前使用__declspec(dllimport) __imp__

在生成的delphi CheckFunctions.dll中,只有一个名为CheckResult的函数 VS C ++ 2010正在寻找__imp__CheckResult。因此,链接器VS C ++找不到此功能。

您必须创建一个.lib文件。
使用程序lib.exe,可以非常轻松地创建.lib文件 从Visual-studio命令提示符运行LIB.exe。

LIB在构建程序时创建标准库,导入库和导出文件,以便与LINK一起使用。

Overview of LIB

如果我们使用Visual-studio命令提示符>创建了

C:\VisualStudio100\VC>lib /def:C:\CheckFunctions.def /OUT:C:\CheckFunctions.lib

可以找到CheckFunctions.lib文件__imp__CheckResult

enter image description here

您可以按照以下步骤进行测试 使用Delphi5和Win xp 32它可以工作。

<强> CheckFunctions.dpr

library CheckFunctions;

uses
  SysUtils,
  Classes;

{$R *.RES}

function CheckResult:integer; stdcall;
begin
   result:=12000;
end;

exports
CheckResult;

begin
end.

创建def文件
CheckFunctions.def

EXPORTS
CheckResult

创建lib文件
Visual Studio命令

C:\Programme\VisualStudio100\VC>lib /def:C:\pathToProject\CheckFunctions.def /OUT:C:\pathToProject\CheckFunctions.lib

CheckFunctions.expCheckFunctions.lib复制到
您的Visual C ++ 2010项目文件夹

Visual C ++ 2010 CallDll.cpp

#include "stdafx.h"

#define MY_DLL __declspec(dllimport)

extern "C"
{
MY_DLL int CheckResult();
} ;

int _tmain(int argc, _TCHAR* argv[])
{
    int myint = CheckResult();
    printf ("Decimals: %d \n", myint );
    return 0;
}

<强>更新 如果你想用__stdcall

新的Visual C ++ 2010 CallDll.cpp

#include "stdafx.h"

#define MY_DLL __declspec(dllimport)

extern "C"
{
MY_DLL int __stdcall CheckResult();
} ;

int _tmain(int argc, _TCHAR* argv[])
{
    int myint = CheckResult();
    printf ("Decimals: %d \n", myint );
    return 0;
}

更改delphi导出

exports
CheckResult name 'CheckResult@0';

更改
CheckFunctions.def

EXPORTS
CheckResult@0
  • 创建一个新的CheckFunctions.lib

也有效。