我在delphi中创建了一个函数,如下所示:
function CheckResult():integer; stdcall; export;
编译器是Delphi 64,输出是CheckFunctions.dll
然后
在VC ++项目中(VS 2012),
我写:
extern "C" __declspec(dllimport) int __stdcall CheckResult();
并在函数中使用它,然后我在C ++项目中得到编译器错误:
错误LINK2019:函数 *
中引用了未解析的外部符号__imp_CheckResult
我该怎么办? 感谢
答案 0 :(得分:3)
您缺少DLL的导入库(.lib文件)。这就是链接器提供该错误消息的原因。不幸的是,Delphi不会生成.lib文件,这在我看来是一个弱点。
您可以通过以下任一方式解决问题:
选项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一起使用。
如果我们使用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;
}
更改delphi导出
exports
CheckResult name 'CheckResult@0';
更改
的 CheckFunctions.def 强>
EXPORTS
CheckResult@0
也有效。