提问人:SADL 提问时间:5/17/2022 最后编辑:Lajos ArpadSADL 更新时间:5/14/2023 访问量:609
如何导出宏函数并在项目 .exe 中使用它?
How can I export a macro function and use it in a project .exe?
问:
我有一个包含服务器.cpp的dll项目(Server.dll)
服务器.cpp
#include "pch.h"
#include "Server.hpp"
extern "C" {
_declspec(dllexport) int Server::Add(int a, int b)
{
return a + b;
}
}
#define Function( Y ) \
\
extern "C" __declspec( dllexport)\
std::string Server::Y(std::string const& name) {\
return name; \
}\
我在另一个项目客户端 .exe 中使用这两个函数
这里 id 主要的
#include <Windows.h>
#include <iostream>
typedef int(*pAdd) (int a, int b);
int main()
{
std::string path = "D:\\project\\Server.dll";
std::wstring stemp = std::wstring(path.begin(), path.end());
LPCWSTR sw = stemp.c_str();
HINSTANCE hinstance = LoadLibrary(sw);
if(!hinstance)
std::cout << "canot load library\n";
pAdd obj = (pAdd)GetProcAddress(hinstance, "Add");
if (obj) {
int result = obj(10, 20);
std::cout << "result = " << result << std::endl;
}
std::string func = "Client";
std::cout << "address = " << GetProcAddress(hinstance, "Y");
}
我可以加载 Add 函数,但无法加载 Y 函数(地址 = 0000000000)
有什么建议吗?
答:
0赞
SADL
5/17/2022
#1
我想在这里发布一个解决方案的示例,也许有人需要有一天创建一个包含函数的宏函数:
我有一个包含类的dll项目:
这里是代码
#include "pch.h"
#include <iostream>
#define Function( Y ) \
\
extern "C" __declspec( dllexport)\
int Y(int a, int b) {\
return (a+b); \
}\
class TestMacro {
Function(Add);
};
在另一个 exe 项目中,我加载了这个函数并在这里使用它的代码:
#include <Windows.h>
#include <iostream>
typedef int(*Y)(int a, int b);
int main()
{
std::string path = "D:\\project\\Server.dll";
std::wstring stemp = std::wstring(path.begin(), path.end());
LPCWSTR sw = stemp.c_str();
HINSTANCE hinstance = LoadLibrary(sw);
if(!hinstance)
std::cout << "canot load library\n";
std::cout << "address = " << GetProcAddress(hinstance, "Add")<< std::endl;
Y y = (Y)GetProcAddress(hinstance, "Add");
int result = y(2,3);
std::cout << "appel Y = " << result<< std::endl;
}
这里输出
address = 00007FFBF98C132F
appel Y = 5
评论
Function
不是一个函数,而是一个宏。而且我没有看到你在任何地方使用它。因此,它不会扩展,也不会添加编码。我建议您搜索 C++ 预处理器和宏教程,以了解有关宏、它们是什么以及它们做什么(和不做什么)的更多信息。