如何导出宏函数并在项目 .exe 中使用它?

How can I export a macro function and use it in a project .exe?

提问人:SADL 提问时间:5/17/2022 最后编辑:Lajos ArpadSADL 更新时间:5/14/2023 访问量:609

问:

我有一个包含服务器.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)

有什么建议吗?

C++ dllexport loadlibrary getprocaddress

评论

0赞 Some programmer dude 5/17/2022
请不要发布文字图片!将文本作为文本复制粘贴到您的问题中。
4赞 5/17/2022
如果你期望宏像函数一样被调用,你就不明白宏是什么。
3赞 Some programmer dude 5/17/2022
Function不是一个函数,而是一个宏。而且我没有看到你在任何地方使用它。因此,它不会扩展,也不会添加编码。我建议您搜索 C++ 预处理器和宏教程,以了解有关宏、它们是什么以及它们做什么(和不做什么)的更多信息。
0赞 SADL 5/17/2022
如何在另一个exe项目中使用dll项目中定义的宏?
2赞 Some programmer dude 5/17/2022
您可能还想了解翻译单元的概念。编译器只处理翻译单元。宏在当前翻译单元之外不存在。如果不使用宏,则不会导致任何代码生成。你不能“导出”宏,也不能将它们“导入”到其他不相关的文件中,绝对不能在一个进程中。

答:

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