使用 __declspec(dllimport)
可以设置命名方法前的 __imp__
。
在生成的 Delphi CheckFunctions.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
。
![enter image description here](https://istack.dev59.com/7mzWP.webp)
您可以按照以下步骤进行测试
在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';
Change
CheckFunctions.def
EXPORTS
CheckResult@0
- 创建一个新的 CheckFunctions.lib
那也可以。