在服务程序中服务启动时用LoadLibrary加载dll并取得dll中函数指针,服务停止时调用FreeLibrary释放加载的dll,现在问题是通过GetProcAddress得到的函数指针如何在其他cpp文件中调用,也就是说如何构造个函数头文件包含进需要调用的cpp中?目前在服务程序的头文件myserv.h里
typedef BOOLEAN(* CONNECTDB)(void);
typedef BOOLEAN(*ISDBCONNECTED)(void);
typedef BOOLEAN(* LOGIN)(const char*,const char*);CONNECTDB ConnectDb;
ISDBCONNECTED IsDbConnected;
LOGIN Login;可是编译时,出现连接错误:
myserv.obj : error LNK2005: "unsigned char (__cdecl* ConnectDb)(void)" (?ConnectDb@@3P6AEXZA) already defined in MySock.obj
myserv.obj : error LNK2005: "unsigned char (__cdecl* IsDbConnected)(void)" (?IsDbConnected@@3P6AEXZA) already defined in MySock.obj
myserv.obj : error LNK2005: "unsigned char (__cdecl* Login)(char const *,char const *)" (?Login@@3P6AEPBD0@ZA) already defined in MySock.obj
而MySock.cpp里包含了MyServ.h
请问大伙如何用LoadLibrary的方式取得的dll中的函数,并且这些函数在工程中其他类的cpp文件里都能调用?

解决方案 »

  1.   

    换个名字试试,例如:
    CONNECTDB FnConnectDb; 
    ISDBCONNECTED FnIsDbConnected; 
    LOGIN FnLogin; 
      

  2.   

    不要在头文件里定义变量
    在头文件里声明,在源文件里定义,extern
      

  3.   

    CONNECTDB ConnectDb; 
    ISDBCONNECTED IsDbConnected; 
    LOGIN Login; 
    这个放到cpp中
    头文件中用
    extern CONNECTDB ConnectDb; 
    extern ISDBCONNECTED IsDbConnected; 
    extern LOGIN Login; 
    声明可以有多个,但是定义只能有一个,可能是你的这个头文件有多个地方包含了
      

  4.   

    你这个是不是跨Cpp文件的全局变量调用??typedef BOOLEAN(* CONNECTDB)(void); 
    typedef BOOLEAN(*ISDBCONNECTED)(void); 
    typedef BOOLEAN(* LOGIN)(const char*,const char*); extern CONNECTDB ConnectDb; 
    extern ISDBCONNECTED IsDbConnected; 
    extern LOGIN Login; 
    //再在myserv.cpp文件里声明
    CONNECTDB ConnectDb; 
    ISDBCONNECTED IsDbConnected; 
    LOGIN Login;
      

  5.   

    你这个是不是跨Cpp文件的全局变量调用?? 是
      

  6.   

    在一个cpp文件中定义变量,在头文件中加extern声明变量。
      

  7.   

    按照楼上兄弟的意思,改了已经能编译并正确运行了,多谢!只是我在头文件里的宏
    #ifndef _MYSERV_
    #define _MYSERV_
    ....../*定义的变量*/
    #endif
    没起到保护作用?
      

  8.   

    这些预编译操作是防止重复包含头文件的。
    你现在遇到的问题是,在头文件中定义了变量,这样相当于包含这个头文件的各个cpp文件中分别定义了这些变量,而不是使用公共变量,连接时报错是因为连接时发现模块之间变量名字冲突。