您的位置:首页 > 编程语言 > C语言/C++

c++ DLL相关使用

2016-12-21 10:09 274 查看

实例:https://github.com/forever19l/FDocuments/tree/master/c%2B%2B/Project/DllDemo

c++创建dll

1、在头定义中使用extern"C"__declspec(dllexport)
表示导出函数,可直接导出整个类,也可无类定义直接导出函数。

2、在有类定义的时候,导出的接口函数名并非原函数名,故有需求时可在外额外封装一层导出所需函数。

3、在cpp内函数头处使用extern"C"
(可不添加)。
4、编译生成dll后可使用depends.exe来查看导出的接口函数。

c++调用c++接口的dll

1、静态调用dll
需要所调用模块的.h文件,.lib文件,.dll文件。
a、将.lib文件放到工程内,在 属性/配置属性/链接器/常规/附加库目录 处添加lib的路径;

b、在属性/配置属性/链接器/输入/附加依赖项 处添加xxx.lib。
c、将被调用的dll放在工程生成的dll或exe同一目录内。
d、将h文件放入工程文件夹内,将.h文件添加到头文件资源中,在所需处include即可。

2、动态调用dll

#include <Windows.h>
HINSTANCE hdll;
hdll=LoadLibrary("C:\\project\\CSocket\\Debug\\CSocket.dll");
if(hdll==NULL){
FreeLibrary(hdll);
}



制作lua接口的c++ dll

1、添加interface.h,interface.h是给lua require该DLL的定义处。 LuaSocket是所生成DLL的名字。

#include<stdio.h>

#include"lua.hpp"

extern "C"__declspec(dllexport)int
__cdecl luaopen_LuaSocket(lua_State * L);

2、添加interface.cpp,cpp为lua require该DLL的实现,该处流程完全一样。

#include"interface.h"

int tolua_global_open(lua_State* tolua_S);

int
__cdecl luaopen_LuaSocket(lua_State *L)

{

printf("< Load for Lua DLL LuaSocket > ...\r\n");

tolua_global_open(L);

printf("< Load for Lua DLL LuaSocket > Finished\r\n");

return 0;

}

3、资源文件内添加
b、添加global.pkg ,include封装给lua接口的c++头文件,并将lua所需的API接口定义加入pkg。

$#include "LuaSocket_function.h"

bool ConnectSocket(const char* ip, int port);

char* SendMsg(const char* cmd);

bool Close();

a、添加批处理文件global.bat (安装windows lua,并设置环境变量)。该批处理是使用tolua++.exe,通过带有接口定义的pkg文件来生成cpp文件(lua实现c++功能)。

rem tolua = C:\lua\bin\tolua++.exe

tolua++.exe -o global_lua.cpp global.pkg

c、使用批处理文件,生成global_lua.cpp文件,并将cpp加入工程内,编译工程即可得到带有lua接口的dll。

4、lua调用dll,在lua文件内添加以下两句即可。
package.cpath = package.cpath..";"..".\\?.dll"

require("LuaSocket");

5、注,如果lua调用的a.dll,a.dll依赖于b.dll,b.dll则需要在a.dll同一级目录下,亦或者a.dll使用的是动态调用b.dll
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++