单件导出类问题
c++吧
全部回复
仅看楼主
level 6
Lion1942 楼主
DLL中定义:
box.h
class _dec
lsp
ec(dllexport) box{
public:
box(){};
double volume();
static box* Init();
static box* pbox;
};
box.cpp
box* box::pbox = 0;
double box::volume()
{
return 10;
}
box* box::Init()
{
if(pbox==0)
{
pbox = new box();
}
return pbox;
};
程序中定义:
定义box.h头文件,不定义源文件:
box.h
class _declspec(dllimport) box{
public:
box(){};
double volume();
static box* Init();
static box* pbox;
};
在调用函数中获取到插件实例:
HINSTANCE m_hInst = LoadLibrary("DLL名称"); //可以正常获取
typedef box* (*m_pFunction)();
typedef double (*pVolume)();
m_pFunction pFun = (m_pFunction)GetProcAddress(m_hInst,"Init"); //可以获取
box* pbox = (*PFun)(); //可以取得
int number = pbox->volume(); //此处出错,为什么?
报错:
无法解析的外部符号 "__declspec(dllimport) public: unsigned int __thiscall CMSInterfaceFacade::Volume(void)" (__imp_?Volume@CMSInterfaceFacade@@QAEIXZ),该符号在函数 "public: void __thiscall CProbeTestDlg::OnBnClickedOk(void)" (?OnBnClickedOk@CProbeTestDlg@@QAEXXZ) 中被引用

2012年10月14日 13点10分 1
level 12
#pragma comment(lib, "xxx.lib")
2012年10月14日 13点10分 2
感谢,但是有个问题,既然DLL是动态加载的,为什么还要导入Lib文件呢?
2012年10月14日 13点10分
回复 Lion1942 :lib定义了dll的接口(也就是导入表)。
2012年10月14日 13点10分
回复 LH_Mouse_Ex :有歧义,应更正:lib包含dll调用方(可能是exe也可能是别的dll)的接口。dll中对应的被调用的接口称为导出表。
2012年10月14日 13点10分
回复 LH_Mouse_Ex :是不是就是说这个LIB中的是DLL里面定义的类中的成员函数接口,可是我既然能获取到DLL内的类的实例对象指针,通过这个指针不就可以调用它的成员函数了么,为什么还要加入LIB呢? 不好意思,再麻烦解答下!
2012年10月14日 14点10分
level 6
double volume();
int number = pbox->volume(); //当你把double volume值复给 int number 时 会发生什么了??? 精度可能会不准的
还有不知道dll 库中要说明int number这个成员吗?????
2012年10月29日 15点10分 3
1