我用VC6的向导做一个dll。
1。new里面选择“MFC AppWizard(dll)”,工程的名字是DLLDemo
2。下一步,接着选择“Regular DLL with MFC statically linked”,然后点击“完成”这个dll只提供两个函数,一个是GetCount()用来得到dll中一个变量的值;另一个是AddCount()用来将变量值加1。我在文件DLLDemo.h里面写了下面的语句,用来声明这两个函数:
#define DLLEXPORT extern "C" _declspec(dllexport)
DLLEXPORT int WINAPI GetCount();
DLLEXPORT void WINAPI AddCount();在文件DLLDemo.cpp里面写了下面的,给函数定义
在文件的上部,写了int nCount = 0;
在文件的下部,写了
int WINAPI GetCount()
{
return nCount;
}void WINAPI AddCount()
{
++nCount;
}至此,可以成功build出dll,而且这个dll文件在其他工程里面可以用,那两个函数可以正确运行。
//////////////////////////////////////////////////////////////////////////////////////这是我看一个教程上面说怎么做dll的,
对于这句#define DLLEXPORT extern "C" _declspec(dllexport),那个教程解释是说,用C编译器来产生dll。
现在,我的问题是:
1。如果我把extern "C"去掉,即仅仅是#define DLLEXPORT _declspec(dllexport),
就发现DLLDemo工程就更本不能build通过(更别提那两个函数给别工程用了),出错的提示是:
warning LNK4022、warning LNK4002、error LNK1152、error LNK1141。2。如果我把这句#define DLLEXPORT extern "C" _declspec(dllexport)整个去掉,当然两个函数声明就没有DLLEXPORT修饰了,发现build还是出错,出错的提示与上面的一样。请问,怎么回事?
如果我不想用extern "C",该如何办?
谢谢!
1。new里面选择“MFC AppWizard(dll)”,工程的名字是DLLDemo
2。下一步,接着选择“Regular DLL with MFC statically linked”,然后点击“完成”这个dll只提供两个函数,一个是GetCount()用来得到dll中一个变量的值;另一个是AddCount()用来将变量值加1。我在文件DLLDemo.h里面写了下面的语句,用来声明这两个函数:
#define DLLEXPORT extern "C" _declspec(dllexport)
DLLEXPORT int WINAPI GetCount();
DLLEXPORT void WINAPI AddCount();在文件DLLDemo.cpp里面写了下面的,给函数定义
在文件的上部,写了int nCount = 0;
在文件的下部,写了
int WINAPI GetCount()
{
return nCount;
}void WINAPI AddCount()
{
++nCount;
}至此,可以成功build出dll,而且这个dll文件在其他工程里面可以用,那两个函数可以正确运行。
//////////////////////////////////////////////////////////////////////////////////////这是我看一个教程上面说怎么做dll的,
对于这句#define DLLEXPORT extern "C" _declspec(dllexport),那个教程解释是说,用C编译器来产生dll。
现在,我的问题是:
1。如果我把extern "C"去掉,即仅仅是#define DLLEXPORT _declspec(dllexport),
就发现DLLDemo工程就更本不能build通过(更别提那两个函数给别工程用了),出错的提示是:
warning LNK4022、warning LNK4002、error LNK1152、error LNK1141。2。如果我把这句#define DLLEXPORT extern "C" _declspec(dllexport)整个去掉,当然两个函数声明就没有DLLEXPORT修饰了,发现build还是出错,出错的提示与上面的一样。请问,怎么回事?
如果我不想用extern "C",该如何办?
谢谢!
解决方案 »
- 虚拟列表CListCtrl能够使用LVS_EX_CHECKBOXES属性么?
- 如何获取当前登录的windows用户名?
- Create table tablename();
- 菜鸟求助!!帮帮忙
- 奇怪问题,要求置顶,win32 Dynamic-link library 连接 sybase 数据库的问题,详细请进http://community.csdn.net/Expert/TopicView3.asp?
- 有知道的吗?我想在WORD里嵌入一个按钮,点击然后发送打印消息给WORD,不知道该如何实现?
- 初学VC,散分的问题,一解决就结贴(急,在线等)
- list的ITEM的背景色
- 关于自定义声音资源的添加
- help!救命!ÿ5?'十万火急,救人如救火,总之,各路大侠前来帮忙啊!!!!
- 如果不用DeleteObject()释放画刷画笔之类的,程序退出后是不是内存还被占用?
- 请大家给我推荐几本编写DLL的好书或教程吧
可以不要extern "C"的。
DLLEXPORT void WINAPI AddCount();
=>
int WINAPI DLLEXPORT GetCount();
void DLLEXPORT WINAPI AddCount();
?
Rebuild?
///////////////////////////////////////////////
第一种情况:
文件DLLDemo.h里面
#define DLLEXPORT extern "C" _declspec(dllexport)
DLLEXPORT int WINAPI GetCount();
DLLEXPORT void WINAPI AddCount();文件DLLDemo.cpp里面
int WINAPI GetCount()
{
return nCount;
}void WINAPI AddCount()
{
++nCount;
}build成功了!
//////////////////////////////////////////////////////////////////////////////////////////////
第二种情况:
文件DLLDemo.h里面,即去掉了extern "C"
#define DLLEXPORT _declspec(dllexport)
DLLEXPORT int WINAPI GetCount();
DLLEXPORT void WINAPI AddCount();文件DLLDemo.cpp里面
int WINAPI GetCount()
{
return nCount;
}void WINAPI AddCount()
{
++nCount;
}
buil不成功!
//////////////////////////////////////////////////////////////////////////////////////////////
第二种情况:
文件DLLDemo.h里面,即去掉了#define...
int WINAPI GetCount();
void WINAPI AddCount();文件DLLDemo.cpp里面
int WINAPI GetCount()
{
return nCount;
}void WINAPI AddCount()
{
++nCount;
}
buil不成功!
///////////////////////////////////////////////
可否发至
[email protected]
#define DLLEXPORT _declspec(dllexport)
DLLEXPORT int WINAPI GetCount();
DLLEXPORT void WINAPI AddCount();
...
//.cpp
...
int nCount=0;
DLLEXPORT int WINAPI GetCount()
{
return nCount;
}
...DLLEXPORT void WINAPI AddCount()
{
++nCount;
}
这样可以,我已经试过
我又重新做了一个DLLDemo工程,把上面的情况都做了一次,竟然三种情况都build成功!!!