这个是代码:
/* 文件名:dll.h*/
#ifndef DLL_H
#define DLL_H
extern "C" int_declspce(dllexport)add(int x,int y);
#endif/*文件名:dll.cpp*/
#include"dll.h"
int add(int x,int y)      
{
   return x+y;
}
  //报错:1>------ 已启动生成: 项目: dll, 配置: Debug Win32 ------
1>正在编译...
1>dll.cpp
1>e:\颖猪猪的学习园地\dll\dll\dll\dll.h(4) : error C2065: “dllexport”: 未声明的标识符
1>e:\颖猪猪的学习园地\dll\dll\dll\dll.h(4) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
1>e:\颖猪猪的学习园地\dll\dll\dll\dll.h(4) : error C2146: 语法错误 : 缺少“;”(在标识符“add”的前面)
1>e:\颖猪猪的学习园地\dll\dll\dll\dll.h(4) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
1>生成日志保存在“file://e:\颖猪猪的学习园地\DLL\dll\dll\Debug\BuildLog.htm”
1>dll - 4 个错误,0 个警告
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========第二个工程中的调用文件:
#include<stdio.h>
#include<windows.h>
typedef int(*lpAddFun)(int,int);
int main(int argc,char*argv[])
{
   HINSTANCE hDll;//DLL句柄
   lpAddFun addFun;//函数指针
   hDll=LoadLibrary()
}//报错: 1>------ 已启动生成: 项目: dllCall, 配置: Debug Win32 ------
1>正在编译...
1>main.cpp
1>e:\颖猪猪的学习园地\dll\dll\dllcall\main.cpp(8) : error C2660: “LoadLibraryW”: 函数不接受 0 个参数
1>e:\颖猪猪的学习园地\dll\dll\dllcall\main.cpp(9) : error C2143: 语法错误 : 缺少“;”(在“}”的前面)
1>生成日志保存在“file://e:\颖猪猪的学习园地\DLL\dll\dllCall\Debug\BuildLog.htm”
1>dllCall - 2 个错误,0 个警告
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========
麻烦了!!!谢谢~~

解决方案 »

  1.   

    extern "C" int_declspce(dllexport)add(int x,int y); 
    改为extern "C" int _declspec(dllexport)add(int x,int y); 
      

  2.   

     hDll=LoadLibrary() 
    改为hDll=LoadLibrary(路径+dll) 
      

  3.   

    __declspec和int之间要有一个空格,__declspec前面有两个下划线hDll=LoadLibrary("abc.dll");
    注意参数和语句结束的分号。多看编译器提示的错误,根据错误进行修改即可。 
      

  4.   

    PS: declspce-》declspec
      

  5.   

    那请问这个又是什么意思呢?
    #include<stdio.h>
    #include<windows.h>
    typedef int(*lpAddFun)(int,int);//宏定义函数指针
    int main(int argc,char*argv[])
    {
       HINSTANCE hDll;//DLL句柄
       lpAddFun addFun;//函数指针
       hDll=LoadLibrary("..\\Debug\\dllTest.dll");
       if(hDll != NULL)
       {
       addFun=(lpAddFun)GetProcAddress(hDll,"add");
       if(addFun != NULL)
       {
          int result = addFun(2,3);
      printf("%d",result);
       }
       FreeLibrary(hDll);   }
       return 0;
    }1>------ 已启动生成: 项目: dllCall, 配置: Debug Win32 ------
    1>正在编译...
    1>main.cpp
    1>e:\颖猪猪的学习园地\dll\dll\dllcall\main.cpp(8) : error C2664: “LoadLibraryW”: 不能将参数 1 从“const char [21]”转换为“LPCWSTR”
    1>        与指向的类型无关;转换要求 reinterpret_cast、C 样式转换或函数样式转换
    1>生成日志保存在“file://e:\颖猪猪的学习园地\DLL\dll\dllCall\Debug\BuildLog.htm”
    1>dllCall - 1 个错误,0 个警告
    ========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========
      

  6.   

    hDll=LoadLibrary("..\\Debug\\dllTest.dll"); 
    因为你是Unicode的工程,而你输入的字符串是ANSI的。
    改为hDll=LoadLibrary(_T("..\\Debug\\dllTest.dll"));
    一般不这么直接写字符串,因为调用的Dll一般和exe在同一目录。一般这么写:
    TCHAR szPath[MAX_PATH] = {0};
    DWORD dwRet = GetModuleFileName(NULL, szPath, MAX_PATH);
    if(!dwRet)
    return;
    CString path(szPath);
    path = path.Left(path.ReverseFind(_T('\\')));
    path += _T("\\dllTest.dll");
    hDll=LoadLibrary(path);
      

  7.   

    你的程序是基于console的,第一个参数就是程序的路径,所以可以这么写:
    TCHAR * Arg = argv[0];
    CString path(Arg);
    path = path.Left(path.ReverseFind(TCHAR('\\')));
    path += _T("\\vpncheck.dll");
    hDll=LoadLibrary(path);
      

  8.   

    您的意思是把:hDll=LoadLibrary("..\\Debug\\dllTest.dll"); 替换成:
    TCHAR * Arg = argv[0]; 
    CString path(Arg); 
    path = path.Left(path.ReverseFind(TCHAR('\\'))); 
    path += _T("\\vpncheck.dll"); 
    hDll=LoadLibrary(path);
     是吗?
      

  9.   

    我添加了  hDll=LoadLibrary(_T("..\\Debug\\dllTest.dll")); 
    编译后说找不到标识符:
    1>------ 已启动生成: 项目: dllCall, 配置: Debug Win32 ------
    1>正在编译...
    1>main.cpp
    1>e:\颖猪猪的学习园地\dll\dll\dllcall\main.cpp(8) : error C3861: “_T”: 找不到标识符
    1>生成日志保存在“file://e:\颖猪猪的学习园地\DLL\dll\dllCall\Debug\BuildLog.htm”
    1>dllCall - 1 个错误,0 个警告
    ========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========
      

  10.   

    我把   hDll=LoadLibrary(_T("..\\Debug\\dllTest.dll")); 
    直接替换成了  LoadLibraryA,编译通过了 但是有两个 warning....1>e:\颖猪猪的学习园地\dll\dll\dllcall\main.cpp(8) : warning C4551: 缺少参数列表的函数调用
    1>e:\颖猪猪的学习园地\dll\dll\dllcall\main.cpp(9) : warning C4700: 使用了未初始化的局部变量“hDll”不知道有没有影响呢??
      

  11.   

    hDll=LoadLibrary(L"..\\Debug\\dllTest.dll");
    注意L之后没有括号
    使用_T()的话加头文件tchar.h