1,对于生成一个win32的dll,有DllMain(...)和没有DllMain()有什么区别
例如我写一个win32dll工程,里面仅有一个.c文件,内容如下
int Add(int a,int b)
{
return a+b;
}
他能够编译连接,并且我把生成的.lib,和.dll文件考到另一个调用dll的工程
相应目录中
然后有以下程序
#include <stdio.h>
int Add(int a,int b);
void main()
{
printf("%d",Add(3,4))
}
程序居然很好的运行,是否不需要DllMain也能构成一个完整的dll
然而我加入DllMain好象没有什么变化啊。
2,对于一个输出的函数,有无__stdcall的区别?
如 _declspec(dllexport) __stdcall int Add(int a,int b);
和 _declspec(dllexport) int Add(int a,int b);的区别
3,在一个dll的工程中函数有无_declspec(dllexport)的区别?
4, 用def文件声明输出函数和不写def文件的区别?
如MyDll.def
LIBRARY MyDll
EXPROTS
Add @2
Substract @3
5, def文件的输出函数的编号是否不能为@1
6, _declspec(dllimport)和_declspec(dllexport)的区别和用法
7,如果没有.lib文件,只有dll文件是否只能用LoadLibrary的方法
8,对于一个dll工程,如果不写def文件,那么它生成的dll就不能用 GetProcAddress 获取函数地址?
9,extern "C"是什么意思,是否在函数的声明和实现出都要extern "C"还是只要在声明出加extern "C",在调用处的说明是否要加extern "C"。如果函数是在.c文件里声明和实现的,是否不用加extern "C"。如果用.c文件生成的函数,要在.cpp文件里调用,是否要在.cpp文件里的函数说明处加上extern "C",还是什么也不用管。
extern "C"到底用在什么时候。
10,对于一个静态连接库,能否用LoadLibrary+GetProcAddress的方式获取函数然后使用,对于一个.exe文件中的函数,如果想要用有什么方法吗?或者用这种方法行得通吗?
不加dllmain可以运行,因为系统调用了默认的一个空的dllmain,你写了dllmain,就会调你的dllmain
2。当然有区别,压栈方式不一样
3。有declspec(dllexport)的函数编译器会将他写入输出节,可以由外界调用,没有的不会
4。def只是引出函数的一种方式,我觉得没什么区别
5。没见过
6。一个是引出函数一个是引入函数
7。据我所知是这样,不知道对不?
8。非也,完全可以
9。对于extern "c"只有当你编写c++代码而不是直接编写c代码时才用他,具体来说就是告诉编译器不要对函数名做修饰
10 静态连接库好象不用loadlibrary吧,他的函数可以直接用啊,对与exe中的函数一般没办法调用其中函数,起码这种不行
4.如果不用.def文件,而dll源文件中又无#pragma comment(linker,/export:FuncName=FuncName@N"),其中FuncName为要输出的函数名,后面的N为参数压栈字节数,则在显式加载时,用GetProcAdress无法定位函数地址。对隐式链接无影响。
7.是的
8.同4.,用def文件和用#pragma效果一样
9.当你用C++编译器编译dll而这个dll是由C写的程序调用时,就需要dll中加extern "c"
10.对静态链接可以,但无必要;对exe似乎无调用函数的方法
1.有DllMain(...)和没有DllMain()的区别:
不需要DllMain也能构成一个完整的dll
当调用DLL时,会先执行此处的程序段,我们可利用此做一些初始化,DllMain(...)里也有一些参数供我们使用