dll 导出接口
怎么在C++编写的DLL中导出一个接口(interface),然后怎么用EXE去调用。最好有实例。我自己写了一个(利用Delphi的经验),在DLL中导出一个函数,这个函...
怎么在C++编写的DLL中导出一个接口(interface),然后怎么用EXE去调用。最好有实例。
我自己写了一个(利用Delphi的经验),在DLL中导出一个函数,这个函数返回所需的接口类型,但是在EXE中用GetProcessAdress获取不到这个函数的句柄。
1 展开
我自己写了一个(利用Delphi的经验),在DLL中导出一个函数,这个函数返回所需的接口类型,但是在EXE中用GetProcessAdress获取不到这个函数的句柄。
1 展开
6个回答
展开全部
(1)VC编写DLL程序
新建"Win32 Dynamic-Link Library"工程->"一个可以导出某些符号的DLL工程"->完成
添加变量、函数、类
#ifdef MYVCDLL_EXPORTS
#define MYVCDLL_API __declspec(dllexport)
#else
#define MYVCDLL_API __declspec(dllimport)
#endif
////////自定义函数/////////
MYVCDLL_API bool myFunction(void);
////////自定义变量/////////
extern MYVCDLL_API int myVar;
////////自定义类///////////
class MYVCDLL_API MyCCalculator
{
public:
int subtract(int a, int b);
int add(int a, int b);
MyCCalculator();
virtual ~MyCCalculator();
};
(2)VC编写DLL调用程序
#include "stdafx.h"
#include "MyVcDll\MyVcDll.h"
#include "MyVcDll\MyCCalculator.h"
#pragma comment(lib, "MyVcDll\\Debug\\MyVcDll.lib")
int main(int argc, char* argv[])
{
// 调用DLL变量
printf("调用的DLL中的变量的值为:%d\n\n", myVar);
// 调用DLL函数
printf("调用的DLL中的函数MyFunction()的返回值为:%d\n\n", myFunction());
// 调用DLL类
MyCCalculator myCal;
printf("调用DLL中计算类执行加法:%d+%d=%d\n\n", 5, 3, myCal.add(5, 3));
printf("调用DLL中计算类执行减法:%d-%d=%d\n\n", 5, 3, myCal.subtract(5, 3));
printf("End!\n");
return 0;
}
注意C++的多态,接口只能是指针
你的DLL要复制到与你.EXE在1个目录下,否则会说找不到DLL。注意,动态连接方法不需要LIB库,无需复制这个。
新建"Win32 Dynamic-Link Library"工程->"一个可以导出某些符号的DLL工程"->完成
添加变量、函数、类
#ifdef MYVCDLL_EXPORTS
#define MYVCDLL_API __declspec(dllexport)
#else
#define MYVCDLL_API __declspec(dllimport)
#endif
////////自定义函数/////////
MYVCDLL_API bool myFunction(void);
////////自定义变量/////////
extern MYVCDLL_API int myVar;
////////自定义类///////////
class MYVCDLL_API MyCCalculator
{
public:
int subtract(int a, int b);
int add(int a, int b);
MyCCalculator();
virtual ~MyCCalculator();
};
(2)VC编写DLL调用程序
#include "stdafx.h"
#include "MyVcDll\MyVcDll.h"
#include "MyVcDll\MyCCalculator.h"
#pragma comment(lib, "MyVcDll\\Debug\\MyVcDll.lib")
int main(int argc, char* argv[])
{
// 调用DLL变量
printf("调用的DLL中的变量的值为:%d\n\n", myVar);
// 调用DLL函数
printf("调用的DLL中的函数MyFunction()的返回值为:%d\n\n", myFunction());
// 调用DLL类
MyCCalculator myCal;
printf("调用DLL中计算类执行加法:%d+%d=%d\n\n", 5, 3, myCal.add(5, 3));
printf("调用DLL中计算类执行减法:%d-%d=%d\n\n", 5, 3, myCal.subtract(5, 3));
printf("End!\n");
return 0;
}
注意C++的多态,接口只能是指针
你的DLL要复制到与你.EXE在1个目录下,否则会说找不到DLL。注意,动态连接方法不需要LIB库,无需复制这个。
展开全部
注意C++的多态,接口只能是指针
IMyInterface* getInterface(); 这样才行
我写过一个接口封装类,发到你邮箱了。 虽然不是什么核心代码,但是也用在项目里了,代码不要公开。
哦 对了,仔细看了一下你的代码。突然发现你说GetProcessAdress取不到句柄。
那你是否在.DEF里面添加导出函数了呢?
就像这样
; ??.def : Declares the module parameters for the DLL.
LIBRARY "??"
DESCRIPTION ??Windows Dynamic Link Library'
EXPORTS
getInterface; Explicit exports can go here
IMyInterface* getInterface(); 这样才行
我写过一个接口封装类,发到你邮箱了。 虽然不是什么核心代码,但是也用在项目里了,代码不要公开。
哦 对了,仔细看了一下你的代码。突然发现你说GetProcessAdress取不到句柄。
那你是否在.DEF里面添加导出函数了呢?
就像这样
; ??.def : Declares the module parameters for the DLL.
LIBRARY "??"
DESCRIPTION ??Windows Dynamic Link Library'
EXPORTS
getInterface; Explicit exports can go here
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这个函数GetProcessAdress使用之前,你要先LOAD你的DLL库,就是动态装载
你要搞清楚,调DLL里函数基本是有2种,显示和隐式的,你可以查下资料。。
具体意思就是,1个静态加载,1个动态加载,哪个好呢,说不好
动态加载就是编译器把DLL代码块当作程序的1部分来看待,编译的时候就加载了DLL的代码;
动态加载,也就是程序运行时加载,可以在你需要的时候,去加载DLL,这样可能比较节约资源,但可能性能上不如编译时加载完,运行时不用加载来的好。
动态加载:
首先你得用1个函数动态加载,loadlibrary (freelibrary释放)
这个函数返回的应该是DLL句柄;
得到DLL句柄之后,你再用GetProcessAdress,这个函数返回DLL中,你指定的那个函数的地址。
所以,你得先准备1个用来接收这个函数地址的指针变量,类型要和它一模一样才行。
如果这2个函数都调用成功,并返回了正确的值,那你可以在你代码中用了,使用方法和你调用函数一样,写出它名字即可(即你的指针变量名);
当然,你的DLL要复制到与你.EXE在1个目录下,否则会说找不到DLL。注意,动态连接方法不需要LIB库,无需复制这个。
你要搞清楚,调DLL里函数基本是有2种,显示和隐式的,你可以查下资料。。
具体意思就是,1个静态加载,1个动态加载,哪个好呢,说不好
动态加载就是编译器把DLL代码块当作程序的1部分来看待,编译的时候就加载了DLL的代码;
动态加载,也就是程序运行时加载,可以在你需要的时候,去加载DLL,这样可能比较节约资源,但可能性能上不如编译时加载完,运行时不用加载来的好。
动态加载:
首先你得用1个函数动态加载,loadlibrary (freelibrary释放)
这个函数返回的应该是DLL句柄;
得到DLL句柄之后,你再用GetProcessAdress,这个函数返回DLL中,你指定的那个函数的地址。
所以,你得先准备1个用来接收这个函数地址的指针变量,类型要和它一模一样才行。
如果这2个函数都调用成功,并返回了正确的值,那你可以在你代码中用了,使用方法和你调用函数一样,写出它名字即可(即你的指针变量名);
当然,你的DLL要复制到与你.EXE在1个目录下,否则会说找不到DLL。注意,动态连接方法不需要LIB库,无需复制这个。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
我在CSDN找了下,不知道适合你的问题不
(1)VC编写DLL程序
新建"Win32 Dynamic-Link Library"工程->"一个可以导出某些符号的DLL工程"->完成
添加变量、函数、类
#ifdef MYVCDLL_EXPORTS
#define MYVCDLL_API __declspec(dllexport)
#else
#define MYVCDLL_API __declspec(dllimport)
#endif
////////自定义函数/////////
MYVCDLL_API bool myFunction(void);
////////自定义变量/////////
extern MYVCDLL_API int myVar;
////////自定义类///////////
class MYVCDLL_API MyCCalculator
{
public:
int subtract(int a, int b);
int add(int a, int b);
MyCCalculator();
virtual ~MyCCalculator();
};
(2)VC编写DLL调用程序
#include "stdafx.h"
#include "MyVcDll\MyVcDll.h"
#include "MyVcDll\MyCCalculator.h"
#pragma comment(lib, "MyVcDll\\Debug\\MyVcDll.lib")
int main(int argc, char* argv[])
{
// 调用DLL变量
printf("调用的DLL中的变量的值为:%d\n\n", myVar);
// 调用DLL函数
printf("调用的DLL中的函数MyFunction()的返回值为:%d\n\n", myFunction());
// 调用DLL类
MyCCalculator myCal;
printf("调用DLL中计算类执行加法:%d+%d=%d\n\n", 5, 3, myCal.add(5, 3));
printf("调用DLL中计算类执行减法:%d-%d=%d\n\n", 5, 3, myCal.subtract(5, 3));
printf("End!\n");
return 0;
}
(1)VC编写DLL程序
新建"Win32 Dynamic-Link Library"工程->"一个可以导出某些符号的DLL工程"->完成
添加变量、函数、类
#ifdef MYVCDLL_EXPORTS
#define MYVCDLL_API __declspec(dllexport)
#else
#define MYVCDLL_API __declspec(dllimport)
#endif
////////自定义函数/////////
MYVCDLL_API bool myFunction(void);
////////自定义变量/////////
extern MYVCDLL_API int myVar;
////////自定义类///////////
class MYVCDLL_API MyCCalculator
{
public:
int subtract(int a, int b);
int add(int a, int b);
MyCCalculator();
virtual ~MyCCalculator();
};
(2)VC编写DLL调用程序
#include "stdafx.h"
#include "MyVcDll\MyVcDll.h"
#include "MyVcDll\MyCCalculator.h"
#pragma comment(lib, "MyVcDll\\Debug\\MyVcDll.lib")
int main(int argc, char* argv[])
{
// 调用DLL变量
printf("调用的DLL中的变量的值为:%d\n\n", myVar);
// 调用DLL函数
printf("调用的DLL中的函数MyFunction()的返回值为:%d\n\n", myFunction());
// 调用DLL类
MyCCalculator myCal;
printf("调用DLL中计算类执行加法:%d+%d=%d\n\n", 5, 3, myCal.add(5, 3));
printf("调用DLL中计算类执行减法:%d-%d=%d\n\n", 5, 3, myCal.subtract(5, 3));
printf("End!\n");
return 0;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
将dll源程序生成.lib和.dll的文件,然后另建一个工程写完程序后,将.dll在复制到DEBUG文件夹下,将.lib复制到源程序的文件目录下,然后将你生成的.lib文件的名称复制到LINK标签中,编译就搞定了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询