您的位置:首页 > 其它

windows环境DLL链接问题之一:dllimport是必须的吗?

2013-08-28 22:34 267 查看
最近看了Windows核心编程中关于DLL链接的章节,遇到很多很多问题(唉 本人比较笨拙),在此做个小小笔记,也希望能帮到同是程序猿的你们!!

核心编程第十九章讲述了DLL隐含链接的内容,本人完全按照书上敲进去的测试代码,无奈总是编译出错,并且大多是unresolved external symbol问题,于是追根究底,用了一天半的时间看了C/C++修饰符问题,最后才明白,大多问题也都出在这里!

废话不多说,代码就是我们最好的语言啦!下面是我的测试程序的例子,例子也是摘抄的,但是修改了大部分,用的vs2008的IDE:

首先是Dll测试头文件:DllCom.h

#ifndef _DLLOBJ_H_INCLUDED
#define _DLLOBJ_H_INCLUDED
#include

#ifdef _DLLCOM_

#else
//两条下划线才对
#ifdef __cplusplus
//#define _DLLCOM_ extern "C" __declspec(dllimport)
#define _DLLCOM_ extern "C" __declspec (dllexport)
#else
//#define _DLLCOM_ __declspec(dllimport)
#define _DLLCOM_ __declspec (dllexport)
//#define _DLLCOM_
#endif

#endif
//#define XX_XX  _stdcall
#define XX_XX _cdecl
_DLLCOM_  LPSTR  XX_XX GetValueString(int i );
_DLLCOM_   void XX_XX SetValueString(LPCSTR str);
#endif
源代码文件:DllCom.cpp
#include "stdafx.h"
#include
#ifdef __cplusplus
#define _DLLCOM_ extern "C" __declspec (dllexport)
#else
#define _DLLCOM_ __declspec (dllexport)
#endif

#include "DllCom.h"
//创建自己的共享节
#pragma data_seg("MyShared")
char m_strString[256]=__TEXT("hello world!");
volatile bool bInCriticalSection=FALSE;
#pragma data_seg()

//设置可执行的共享节数据操作
#pragma comment(linker,"/SECTION:MyShared,RWS")

CCriticalSection cs;

_DLLCOM_ LPSTR XX_XX GetValueString(int i)
{
#ifdef __cplusplus
printf("dll c++ definition!\n");
#else
printf("dll c++ not definition!\n");
#endif

while(bInCriticalSection) // 等待
Sleep(1);
return m_strString;
}

// 把字符串存储到共享内存中
_DLLCOM_ void XX_XX SetValueString(LPCSTR str)
{
while(bInCriticalSection) // 等待
Sleep(1);
cs.Lock();
bInCriticalSection = TRUE;
strcpy(m_strString,str);
bInCriticalSection = FALSE;
cs.Unlock();
} //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
DLL的测试文件就到这里啦!

代码中有些许注释,相信也能看的懂,回到我们的问题:dllimport是不是一直都是必须的呢

答案是:不是!

这个例子就能够很好的编译成DllCom.dll和DllCom.lib文件(只要DLL中有输出的变量或者函数,就会生成lib文件)!

根据核心编程中的描述,当可执行程序链接到一个函数或者变量时,它会查找经过C/C++规则生成的相应函数的修饰符,查找修饰符的过程就分为隐式链接与显示加载。

隐式链接:这里就用到了lib文件,通过使用__declspec(dllimport)关键字, 编译器预先知道你要引用的符号将从一个DLL文件的.lib文件引入,就能生成运行效率稍高的代码。

显示加载:LIB和DLL的区别与使用

看到这里,相信大家已经知道dllimport关键字的作用了吧!O(∩_∩)O哈哈~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐