一个在VC++ 6.0中调用动态链接库的有关问题

一个在VC++ 6.0中调用动态链接库的问题
我自己建了一个动态库,感觉调用的方法是正确的,但就是在运行时出现link.exe错误,我把我建的动态库以及调用的过程,说一下,大家帮我看看有哪些地方不对的。

我先建了一个非MFC动态库(Win32 Dynamic Link_Library),工程名称为NewDll.dsw,其头文件名为DLLSourceHead.h,主文件为DLLSource.cpp。
头文件DLLSourceHead.h中代码为:
extern "C" _declspec(dllexport) int Max(int a, int b);
extern "C" _declspec(dllexport) int Min(int a, int b);
主文件DLLSource.cpp中的代码为:
#include "DLLSourceHead.h"
int Max(int a, int b)
{
if(a>=b)return a;
else
return b;
}
int Min(int a, int b)
{
if(a>=b)return b;
else
return a;
}
编译后生成了NewDll.dll和NewDll.lib文件。

我再建一个工程myLoadDll.dsw来调用动态库,其头文件为LoadDll.h,主文件为LoadDll.cpp;将NewDll.dll和NewDll.lib文件拷贝到这个工程目录中。
头文件LoadDll.h中的代码为:
#pragma comment(lib,"NewDll.lib")
extern "C" __declspec(dllimport) int __stdcall Max(int,int);
extern "C" __declspec(dllimport) int __stdcall Min(int,int);
主文件LoadDll.cpp中代码为;
#include <iostream>
#include <string>
#include <list>
#include <vector>
#include "LoadDll.h"
using namespace std;
void main()
{
    cout<<Min(10,3)<<'\n'; //调用动态库中的Min函数

}

以上就是我的建动态库以及调用的全过程,编译时没有问题,执行时就出现:
LoadDll.obj : error LNK2001: unresolved external symbol __imp__Min@8
Debug/MyLoadDll.exe : fatal error LNK1120: 1 unresolved externals
执行 link.exe 时出错.

MyLoadDll.exe - 1 error(s), 0 warning(s)
这个错误,不知道怎么弄。

我将NewDll.lib文件添加到 工程->设置->连接->对象/库模块中,还是会出现这个问题!
请大哥大姐们帮忙解答一下

------解决方案--------------------
这么处理一下试试:
//DLLSource.cpp
.....
.....

extern "C" _declspec(dllexport) int Max(int a, int b)
{
if(a>=b)return a;
else
return b;
}
extern "C" _declspec(dllexport) int Min(int a, int b)
{
if(a>=b)return b;
else
return a;
}
------解决方案--------------------
头文件也要用 
extern "C"
{
   #include "DLLSourceHead.h"
};
------解决方案--------------------
楼主关于extern "C"的写法是完全正确,错误在于:
头文件DLLSourceHead.h中代码为:
extern "C" _declspec(dllexport) int Min(int a, int b);  在这里默认的调用约定是__cdecl

头文件LoadDll.h中的代码为:
#pragma comment(lib,"NewDll.lib")
extern "C" __declspec(dllimport) int __stdcall Min(int,int);  在这里却变成了__stdcall,调用约定的方式,编译器的符号修饰方式都一样,当然会有上面的错误了

将头文件DLLSourceHead.h中代码改为:
extern "C" _declspec(dllexport) int __stdcall Min(int a, int b); 即正确
------解决方案--------------------
编译器对于调用约定__cdecl与__stdcall的符号修饰方式是不同的:
 C编译时函数名修饰约定规则:  
     *   __stdcall调用:约定在输出函数名前加上一个下划线前缀,后面加上一个“@”符号和其参数的字节数,格式为_functionname@number;   
    *   __cdecl调用:约定仅在输出函数名前加上一个下划线前缀,格式为_functionname;