一个带命令行参数的win32 console Application怎么才能正确导出一个Dll
一个带命令行参数的win32consoleApplication怎么才能正确导出一个Dll,并在其他项目里调用此DLL不会出错?是不是有什么地方要设置?(我导出了一个DL...
一个带命令行参数的win32 console Application怎么才能正确导出一个Dll,并在其他项目里调用此DLL不会出错?是不是有什么地方要设置?(我导出了一个DLL,但在调用DLL的项目里会出错,能够加载DLL,用GetProcAddress函数得不到接口函数的句柄)。我用同样的方法导出一个DLL,只是用的是win32 Dynamic-DLL建的工程,调用没有问题。主要解决怎么从一个win32 console中导出一个能够在其他工程里正确调用的DLL。
展开
1个回答
2013-08-22
展开全部
(以下程序在 Microsoft Visual Studio 2008 中编写)
【编写动态链接库】
1、首先建立一个动态链接库(DLL)工程。
建立方法:新建 Win32 工程时选择 DLL 属性,或者建立一个空工程,在工程属性里将 Configuration Type 设置为“dll”。
2、添加源文件“name.c”
这里也可以起名为“name.cpp”,不过这样就需要在文件里使用“extern "C"”来设置编译方式。
3、在“name.c”里直接添加需要被其他程序调用的函数或类的代码,如
__declspec(dllexport) void ExportedFunction()
{
}
其中“__declspec”是微软定义的扩展C/C++关键字,“__declspec(dllexport)”表示函数“ExportedFunction”将被导出DLL文件,被导出的函数可以在加载了该DLL的程序中使用。
如果文件扩展名为“cpp”,则应该像下面这样将导出函数用“extern "C"”包围起来,表示这些函数将以C的形式被编译。
extern "C"
{
__declspec(dllexport) void ExportedFunction()
{
}
……
}
4、编译,生成DLL文件,这样就可以在其他应用程序或者DLL文件里面加载这个DLL文件,并且使用它导出的函数了。达到了代码复用的目的。
这样生成的DLL文件属于“non-MFC dll",导出的函数符合C语言标准,可以满足大多数需求。另外DLL文件也可以用MFC来编写,这里不讲述。
最后DLL文件的源代码应该像下面这样:
//--------------------------------------------------
#ifdef __cplusplus
extern "C"
{
#endif__declspec(dllexport) void ExportedFunction()
{
}#ifdef __cplusplus
}
#endif
//--------------------------------------------------【使用动态链接库】
任何可以支持C语言标准和动态链接库技术的程序都可以使用我们编写的DLL文件导出的函数,对于 Windows 应用程序,可以使用 API 函数“LoadLibrary”加载DLL文件,使用“GetProcAddress”获得导出函数的地址。
1、在应用程序里导入动态链接库
HMODULE hModule = LoadLibrary(TEXT("name"));
2、获取导出函数的指针
typedef void (*MYPROC)(void);
MYPROC function = GetProcAddress(hModule, "ExportedFunction");
3、至此,函数已导入完毕。在需要使用从DLL导入的函数的地方直接使用下面的语句
function();
4、程序退出之前,或者已不再需要DLL导出的函数,使用下面的语句将DLL文件释放
FreeLibrary(hModule);
我们可以看到,要使用动态链接库,必须知道它导出的函数的形式和名称。因此对编写好的DLL文件配以必要的说明文件是很重要的。
在调用导出函数的应用程序源文件里,添加如下代码,即可像使用本地函数一样使用导出函数。使用完毕后记得释放动态链接库文件。
//--------------------------------------------------
typedef void (*MYPROC)(void);
HMODULE hModule = LoadLibrary(TEXT("name"));
MYPROC function = GetProcAddress(hModule, "ExportedFunction");
function();
……//其他可能调用function的语句
FreeLibrary(hModule);
//-------------------------------------------------- 以上本人原创。
【编写动态链接库】
1、首先建立一个动态链接库(DLL)工程。
建立方法:新建 Win32 工程时选择 DLL 属性,或者建立一个空工程,在工程属性里将 Configuration Type 设置为“dll”。
2、添加源文件“name.c”
这里也可以起名为“name.cpp”,不过这样就需要在文件里使用“extern "C"”来设置编译方式。
3、在“name.c”里直接添加需要被其他程序调用的函数或类的代码,如
__declspec(dllexport) void ExportedFunction()
{
}
其中“__declspec”是微软定义的扩展C/C++关键字,“__declspec(dllexport)”表示函数“ExportedFunction”将被导出DLL文件,被导出的函数可以在加载了该DLL的程序中使用。
如果文件扩展名为“cpp”,则应该像下面这样将导出函数用“extern "C"”包围起来,表示这些函数将以C的形式被编译。
extern "C"
{
__declspec(dllexport) void ExportedFunction()
{
}
……
}
4、编译,生成DLL文件,这样就可以在其他应用程序或者DLL文件里面加载这个DLL文件,并且使用它导出的函数了。达到了代码复用的目的。
这样生成的DLL文件属于“non-MFC dll",导出的函数符合C语言标准,可以满足大多数需求。另外DLL文件也可以用MFC来编写,这里不讲述。
最后DLL文件的源代码应该像下面这样:
//--------------------------------------------------
#ifdef __cplusplus
extern "C"
{
#endif__declspec(dllexport) void ExportedFunction()
{
}#ifdef __cplusplus
}
#endif
//--------------------------------------------------【使用动态链接库】
任何可以支持C语言标准和动态链接库技术的程序都可以使用我们编写的DLL文件导出的函数,对于 Windows 应用程序,可以使用 API 函数“LoadLibrary”加载DLL文件,使用“GetProcAddress”获得导出函数的地址。
1、在应用程序里导入动态链接库
HMODULE hModule = LoadLibrary(TEXT("name"));
2、获取导出函数的指针
typedef void (*MYPROC)(void);
MYPROC function = GetProcAddress(hModule, "ExportedFunction");
3、至此,函数已导入完毕。在需要使用从DLL导入的函数的地方直接使用下面的语句
function();
4、程序退出之前,或者已不再需要DLL导出的函数,使用下面的语句将DLL文件释放
FreeLibrary(hModule);
我们可以看到,要使用动态链接库,必须知道它导出的函数的形式和名称。因此对编写好的DLL文件配以必要的说明文件是很重要的。
在调用导出函数的应用程序源文件里,添加如下代码,即可像使用本地函数一样使用导出函数。使用完毕后记得释放动态链接库文件。
//--------------------------------------------------
typedef void (*MYPROC)(void);
HMODULE hModule = LoadLibrary(TEXT("name"));
MYPROC function = GetProcAddress(hModule, "ExportedFunction");
function();
……//其他可能调用function的语句
FreeLibrary(hModule);
//-------------------------------------------------- 以上本人原创。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询