oledb32.dll中有哪些函数c#dll看导出库函数函数

准确看看 user32.dll 里有哪些导出函数_百度知道
准确看看 user32.dll 里有哪些导出函数
答题抽奖
首次认真答题后
即可获得3次抽奖机会,100%中奖。
缘Lai如茨知道合伙人
来自电脑网络类芝麻团
采纳数:6525
获赞数:5144
参与团队:
// ListExport.cpp : Defines the entry point for the console application.//#include &stdafx.h&#include &windows.h&#include &winnt.h&extern &C& DWORD _stdcall _RVAToOffset(DWORD
_lpFileHead,DWORD _dwRVA);extern &C& DWORD _stdcall _OffsetToRVA(DWORD _lpFileHead,DWORD _dwOffset);extern &C& DWORD _stdcall _getRVASectionName(DWORD _lpFileHead,DWORD _dwRVA);HANDLE m_HANDLE m_LPVOID m_LPVOID RvaToPtr(DWORD dwBase,DWORD dwRVA){
DWORD dd=_RVAToOffset(dwBase,dwRVA);
return (LPVOID)}bool LoadPE(){
bool bret=
wchar_t pwch[]=L&C:\\Windows\\System32\\user32.dll&;
m_file=CreateFile(pwch,
GENERIC_READ ,
FILE_SHARE_READ | FILE_SHARE_WRITE,
OPEN_EXISTING,
FILE_ATTRIBUTE_ARCHIVE,
if(m_file==INVALID_HANDLE_VALUE)
m_map=CreateFileMapping(m_file,
NULL,PAGE_READONLY,
if (m_map==NULL)
CloseHandle(m_file);
m_base=MapViewOfFile(m_map,
FILE_MAP_READ,
if(m_base==NULL)
CloseHandle(m_map);
CloseHandle(m_file);
bret=}void UnloadPE(){
UnmapViewOfFile(m_base);
CloseHandle(m_map);
CloseHandle(m_file);}void ListExport(){
DWORD dbase=(DWORD)m_
PIMAGE_DOS_HEADER dos=(PIMAGE_DOS_HEADER)
PIMAGE_NT_HEADERS nt=(PIMAGE_NT_HEADERS)(dbase+dos-&e_lfanew);
PIMAGE_EXPORT_DIRECTORY exp=(PIMAGE_EXPORT_DIRECTORY)(RvaToPtr(dbase,nt-&OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress));
PDWORD pdwNames,pdwR
pdwNames=(PDWORD)RvaToPtr(dbase,exp-&AddressOfNames);
pdwRvs=(PDWORD)RvaToPtr(dbase,exp-&AddressOfFunctions);
pwOrds=(PWORD)RvaToPtr(dbase,exp-&AddressOfNameOrdinals);
if (!pdwRvs)
DWORD iNumOfNames=exp-&NumberOfN
bool bIsByName=
char szExportByOrd[]=&[NONAME]&;
char buf[2000],*
char *szFuncN
DWORD i,j,hint=-1;
printf(&Export Function Table vs MS dumpbin exports v0.0001.....\n\n\n ordinal
name\n&);
for (i=0;i&exp-&NumberOfFi++)
if(*pdwRvs)
bIsByName=
for (j=0;j&iNumOfNj++)
if(i==pwOrds[j])
bIsByName=
if (bIsByName)
szFuncName=(char*)RvaToPtr(dbase,pdwNames[j]);
printf(&%8ld
%s\n&,exp-&Base+i,hint,*pdwRvs,szFuncName);
szFuncName=szExportByO
int ilen=sprintf(pbuf,&%8ld
%s\n&,exp-&Base+i,*pdwRvs,szFuncName);
pbuf=pbuf+
printf(&%s\n&,buf);}int _tmain(int argc, _TCHAR* argv[]){
if (LoadPE())
ListExport();
UnloadPE();
getchar();
return 0;}
为你推荐:
其他类似问题
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。DLL 导出方法(两种)
使用 DEF 文件从 DLL 导出
模块定义 (.def) 文件是包含一个或多个描述 DLL 各种特性的 Module 语句的文本文件。 如果不使用 __declspec(dllexport) 关键字导出
DLL 的函数,则 DLL 需要 .def 文件。
.def 文件必须至少包含下列模块定义语句:
文件中的第一个语句必须是 LIBRARY 语句。 此语句将
.def 文件标识为属于 DLL。 LIBRARY 语句的后面是 DLL 的名称。 链接器将此名称放到
DLL 的导入库中。
EXPORTS 语句列出名称,可能的话还会列出 DLL 导出函数的序号值。 通过在函数名的后面加上
@ 符和一个数字,给函数分配序号值。 当指定序号值时,序号值的范围必须是从 1 到 N,其中 N 是 DLL 导出函数的个数。 如果希望按序号导出函数,请参见 以及本主题。
例如,包含实现二进制搜索树的代码的 DLL 看上去可能像下面这样:
如果使用 创建 MFC DLL,则向导将为您创建主干 .def 文件并将其自动添加到项目中。 添加要导出到此文件的函数名。 对于非
MFC DLL,必须亲自创建 .def 文件并将其添加到项目中。
如果导出 C++ 文件中的函数,必须将修饰名放到 .def 文件中,或者通过使用外部“C”定义具有标准 C 链接的导出函数。 如果需要将修饰名放到
.def 文件中,则可以通过使用
链接器选项来获取修饰名。 请注意,编译器产生的修饰名是编译器特定的。 如果将
Visual C++ 编译器产生的修饰名放到 .def 文件中,则链接到 DLL 的应用程序必须也是用相同版本的 Visual C++ 生成的,这样调用应用程序中的修饰名才能与 DLL 的 .def 文件中的导出名相匹配。
并使用 .def 文件导出,则将下列代码放在包含导出类的头文件的开头和结尾:
#undef AFX_DATA
#define AFX_DATA AFX_EXT_DATA
// &body of your header file&
#undef AFX_DATA
#define AFX_DATA
这些代码行确保内部使用的 MFC 变量或添加到类的变量是从扩展 DLL 导出(或导入)的。 例如,当使用 DECLARE_DYNAMIC 派生类时,该宏扩展以将 CRuntimeClass 成员变量添加到类。 省去这四行代码可能会导致不能正确编译或链接
DLL,或在客户端应用程序链接到 DLL 时导致错误。
当生成 DLL 时,链接器使用 .def 文件创建导出 (.exp) 文件和导入库 (.lib) 文件。 然后,链接器使用导出文件生成
DLL 文件。 隐式链接到 DLL 的可执行文件在生成时链接到导入库。
请注意,MFC 本身使用 .def 文件从 MFCx0.dll 导出函数和类。
网址:https://msdn.microsoft.com/zh-cn/d91k01sh(v=vs.90)
使用 __declspec(dllexport) 从 DLL 导出
Microsoft 在 Visual C++ 的 16 位编译器版本中引入了 __export,使编译器得以自动生成导出名并将它们放到一个
.lib 文件中。 然后,此 .lib 文件就可以像静态 .lib 那样用于与 DLL 链接。
在更新的编译器版本中,可以使用 __declspec(dllexport) 关键字从
DLL 导出数据、函数、类或类成员函数。 __declspec(dllexport) 会将导出指令添加到对象文件中,因此您不需要使用
.def 文件。
当尝试导出 C++ 修饰函数名时,这种便利最明显。 由于对名称修饰没有标准规范,因此导出函数的名称在不同的编译器版本中可能有所变化。 如果使用 __declspec(dllexport),仅当解决任何命名约定更改时才必须重新编译
DLL 和依赖 .exe 文件。
许多导出指令(如序号、NONAME 和 PRIVATE)只能在 .def 文件中创建,并且必须使用 .def 文件来指定这些特性。 不过,在
.def 文件的基础上另外使用 __declspec(dllexport) 不会导致生成错误。
若要导出函数,__declspec(dllexport) 关键字必须出现在调用约定关键字的左边(如果指定了关键字)。 例如:
__declspec(dllexport) void __cdecl Function1(void);
若要导出类中的所有公共数据成员和成员函数,关键字必须出现在类名的左边,如下所示:
class __declspec(dllexport) CExampleExport : public CObject
{ ... class definition ... };
__declspec(dllexport) 不能应用于具有 __clrcall 调用约定的函数。
生成 DLL 时,通常创建一个包含正在导出的函数原型和/或类的头文件,并将 __declspec(dllexport) 添加到头文件中的声明中。 若要提高代码的可读性,请为 __declspec(dllexport) 定义一个宏并对正在导出的每个符号使用该宏:
#define DllExport
__declspec( dllexport )
__declspec(dllexport) 将函数名存储在
DLL 的导出表中。 如果希望优化表的大小,请参见 。
将 DLL 源代码从 Win16 移植到 Win32 时,请用 __declspec(dllexport) 替换 __export 的每个实例。
作为参考,请在 Win32 Winbase.h 头文件中搜索。 它包含 __declspec(dllimport) 的用法示例。
网址:https://msdn.microsoft.com/zh-cn/a90k134d(v=vs.90)
模块定义 (.Def) 文件
模块定义 (.def) 文件为链接器提供有关被链接程序的导出、特性及其他方面的信息。 生成
DLL 时,.def 文件最有用。 由于存在可代替模块定义语句使用的 ,通常不需要
.def 文件。 也可以将
用作指定导出函数的手段。
在链接器阶段可以使用 链接器选项调用
.def 文件。
如果生成的 .exe 文件没有导出,使用 .def 文件将使输出文件较大并降低加载速度。
有关示例,请参见 。
有关更多信息,请参见下列章节:
网址:https://msdn.microsoft.com/zh-cn/28d6s79h(VS.90).aspx
关于DLL导出函数的总结
DLL 函数导出的规则和方法
DLL导出类和导出函数
C++ DLL导出函数的两种方法(导出序号那种方法,别人看不到函数名)
DLL中导出函数的两种方式
C++动态链接库导出函数或者类
动态链接库导出函数示例
dll 导出函数
DLL 的编写,导出函数
windows 查看DLL导出函数的方法
没有更多推荐了,要谦虚、要低调、做事要谨慎,多听听别人的意见,少发表一些主观意见,除非有确凿的证据,而不是凭记忆!...
dll 导出函数名的那些事
经常使用VC6的Dependency查看DLL导出函数的名字,会发现有DLL导出函数的名字有时大不相同,导致不同的原因大多是和编译DLL时候指定DLL导出函数的界定符有关系。
VC++支持两种语言:即C/C++,这也是造成DLL导出函数差异的根源
我们用VS2008新建个DLL工程,工程名为“TestDLL”
把默认的源文件后缀 .CPP改为.C(C文件)
输入测试代码如下:
01 int _stdcall MyFunction(int iVariant)
03 return 0;
为了导出上面这个函数,我们有以下几个方法:
1. 使用传统的模块定义文件 (.def)
新建一个 后缀为.def的文本文件(这里建一个TestDll.Def),文件内容为:
LIBRARY TestDll
MyFunction
在 Link 时指定输入依赖文件:/DEF:"TestDll.Def"
2. Visual C++ 提供的方便方法
在01行的int 前加入 __declspec(dllexport) 关键字
通过以上两种方法,我们就可以导出MyFunction函数。
我们用Dependency查看导出的函数:
第一种方法导出的函数为:
MyFunction
第二种方法导出的函数为:
_MyFunction@4
__stdcall会使导出函数名字前面加一个下划线,后面加一个@再加上参数的字节数,比如_MyFunction@4的参数(int iVariant)就是4个字节
__fastcall与 __stdcall类似,不过前面没有下划线,而是一个@,比如@MyFunction@4
__cdecl则是始函数名。
小结:如果要导出C文件中的函数,并且不让编译器改动函数名,用def文件导出函数。
下面我们来看一下C++文件
我们用VS2008新建个DLL工程,工程名为“TestDLL”
默认的源文件后缀为 .CPP (即C++文件)。
输入测试代码如下:
01 int _stdcall MyFunction(int iVariant)
03 return 0;
为了导出上面这个函数,我们有以下几个方法:
3. 使用传统的模块定义文件 (.def)
新建一个 后缀为.def的文本文件(这里建一个TestDll.Def),文件内容为:
LIBRARY TestDll
MyFunction
在 Link 时指定输入依赖文件:/DEF:"TestDll.Def"
4. Visual C++ 提供的方便方法
在01行的int 前加入 __declspec(dllexport) 关键字
通过以上两种方法,我们就可以导出MyFunction函数。
我们用Dependency查看导出的函数:
第一种方法导出的函数为:
MyFunction
第二种方法导出的函数为:
?MyFunction@@YGHH@Z
可以看到 第二种方法得到的 导出函数名 并不是我们想要的,如果在exe中用显示方法(LoadLibrary、GetProcAddress)调用 MyFunction 肯定会失败。
但是用引入库(*.LIB)的方式调用,则编译器自动处理转换函数名,所以总是没有问题。
解决这个问题的方法是:
用VC 提供的预处理指示符 “#pragma” 来指定链接选项。
#pragma comment(linker, "/EXPORT:MyFunction=?MyFunction@@YGHH@Z")
这时,就会发现导出的函数名字表中已经有了我们想要的MyFunction。但我们发现原来的那个 ?MyFunction@@YGHH@Z 函数还在,这时就可以把 __declspec() 修饰去掉,只需要 pragma 指令即可。
而且还可以使如下形式:
#pragma comment(linker, "/EXPORT:MyFunction=_MyFunction@4,PRIVATE")
PRIVATE 的作用与其在 def 文件中的作用一样。更多的#pragram请查看MSDN。
小结:如果要导出C++文件中的函数,并且不让编译器改动函数名,用def文件导出函数。
同时可以用#pragma指令(C 中也可以用)。
C++编译器在生成DLL时,会对导出的函数进行名字改编,并且不同的编译器使用的改编规则不一样,因此改编后的名字也是不同的(一般涉及到C++ 中的重载等)。
如果利用不同编译器分别生成DLL和访问DLL的exe程序,后者在访问该DLL的导出函数时就会出现问题。如上例中函数MyFunction在C++编译器改编后的名字是?MyFunction@@YGHH@Z。我们希望编译后的名字不发生改变,这里有几种方法。
第一种方法是通过一个称为模块定义文件DEF来解决。
LIBRARY TestDll
MyFunction
LIBRARY 用来指定动态链接库内部名称。该名称与生成的动态链接库名一定要匹配,这句代码不是必须的。
EXPORTS说明了DLL将要导出的函数,以及为这些导出函数指定的符号名。
第二种是定义导出函数时加上限定符:extern "C"
如:#define DLLEXPORT_API extern "C" _declspec(dllexport)
但extern "C"只解决了C和C++语方之间调用的问题(extern “C” 是告诉编译器,让它按C的方式编译),它只能用于导出全局函数这种情况 而不能导出一个类的成员函数。
同时如果导出函数的调用约定发生改变,即使使用extern "C",编译后的函数名还是会发生改变。例如上面我们加入_stdcall关键字说明调用约定(标准调用约定,也就是WINAPI调用约定)。
#define DLLEXPORT_API extern "C" _declspec(dllexport)
01 DLLEXPORT_API int _stdcall MyFunction(int iVariant)
03 return 0;
编译后函数名MyFunction改编成了_MyFunction@4
通过第一种方法模块定义文件的方式DLL编译后导出函数名不会发生改变。
C#调用C(C++)dll示例教程,包含dll找不到函数入口的解决办法,包含C#dll调用方式不对出错的解决办法
巧妙修改vc++生成的dll名称
关于DLL导出函数的总结
VS2015用C++创建的动态库导出函数名乱码原因分析
DLL导出函数名称改编的解决方法
解决vc dll导出函数名字发生改变问题
VS下怎么直接查看dll中函数的名称
DLL中导出函数的两种方式(dllexport与.def文件)
得到DLL中的指定函数地址
解决DLL导出函数的名字改编问题
没有更多推荐了,DLL导出函数的声明和调用_百度文库
您的浏览器Javascript被禁用,需开启后体验完整功能,
享专业文档下载特权
&赠共享文档下载特权
&10W篇文档免费专享
&每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
DLL导出函数的声明和调用
你可能喜欢准确看看 user32.dll 里有哪些导出函数_百度知道
准确看看 user32.dll 里有哪些导出函数
答题抽奖
首次认真答题后
即可获得3次抽奖机会,100%中奖。
匿名用户知道合伙人
VS2010的操作方法如下:1. 打开命令行窗口CMD2. 运行vcvarsall.bat(VS2010 里vcvarsall.bat是在右键VS打开文件位置,D:\Microsoft Visual Studio 10.0\Common7\Tools目录下,运行方法是直接将vcvarsall.bat文件拖入命令行窗口,然后回车。(拖入相当于在命令行中输入“D:\Microsoft Visual Studio 10.0\Common7\Tools\vcvarsall.bat”))。运行vcvarsall.bat后,窗口中出现“Setting environment for using Microsoft Visual Studio 2010 x86 tools.”3. 在命令行了输入命令:dumpbin /exports “C:\Windows\System32\user32.dll” 回车即可看到。
为你推荐:
其他类似问题
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。

我要回帖

更多关于 调用dll未导出函数 的文章

 

随机推荐