3

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

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

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

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

错误 LINK2019:函数中引用的未解析的外部符号 __imp_CheckResult *

我能怎么做?谢谢

4

3 回答 3

3

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

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

  1. 与 LoadLibrary/GetProcAddress 链接。
  2. 生成合适的 .lib 文件。

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

这真的很明显。制作一个与真实 DLL 具有相同接口的假 DLL。相同的名称,相同的功能。伪造的 DLL 不需要实现,因为您所做的只是让 MS 工具生成 Delphi 无法生成的 .lib 文件。

更多详细信息:http: //support.microsoft.com/kb/131313


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

于 2013-05-30T15:49:00.210 回答
2

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

于 2013-05-30T18:24:12.343 回答
-1

在设置命名方法之前 使用__declspec(dllimport)a 。__imp__

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

您必须创建一个 .lib 文件。
使用该程序lib.exe可以很容易地创建这个 .lib 文件。
从 Visual-studio 命令提示符运行 LIB.exe。

LIB 创建标准库、导入库和导出文件,您可以在构建程序时使用 LINK。

LIB 概述

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

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

CheckFunctions.lib文件__imp__CheckResult可以找到。

在此处输入图像描述


您可以使用 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.exp到您CheckFunctions.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;
}

更改德尔福出口

exports
CheckResult name 'CheckResult@0';

更改
CheckFunctions.def

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

这也有效。

于 2013-05-30T21:03:21.553 回答