我被赋予了创建具有许多功能的DLL的任务。函数的具体实现实际上非常简单,但一般(或更好:初始)设置让我头疼,我还没有理解它。所以这是我应该实现的两个(很多)函数:
long initClient(long* client, char* a = "", char* b = "");
long clientSet(int client, const char* a, const char* b);
第一个函数将设置一个客户端(可能有0..n,每个客户端都有内部状态数据),所以不知何故它需要在内部跟踪客户端相关数据。现在每当我调用clientSet(第二个函数)时,我需要传递整数值(long * client),我从initClient传递给函数,以便它可以识别正确的客户端数据结构并更改那些数据。
现在的实际问题是:我该如何正确地做到这一点?
我目前的解决方案是保存客户端的内部列表及其关联的数据/ ID,并在添加或删除客户端时使用malloc / free。然而,我觉得这不是一个干净的解决方案,或者它可以以更好的方式解决。
非常感谢您的帮助。
编辑:重新思考后,可能是clientSet的第一个参数实际上是我从initClient(第一个参数)得到的指针吗?如果是这种情况,initClient只需要malloc一些内存并用数据填充。所有其他调用只会引用该内存区域。然而,我发现为同一个指针使用不同的数据类型非常麻烦(我得到一个指向long的指针,然后我需要将其解释为int - 我知道它们都是Win32上的4个字节)。我在这儿吗?编辑#2:不幸的是我不允许以任何方式更改界面。
编辑#3:在更多地思考这个问题后,也许这就是我实际上的目标:intptr_t my_ptr;
long initClient(intptr_t* client, char* a, char* b);
long clientSet(intptr_t client, char* a, char* b);
initClient(& my_ptr,“A”,“B”)基本上(我需要看看如何正确地进行解引用)做一个
*client = (intptr_t)malloc(sizeof(myDataStructure));
现在我可以打电话了
clientSet(my_ptr, "X", "Y");
这看起来可能是我应该做的吗?
答案 0 :(得分:2)
您需要导出C函数,但您可以使用C ++实现它们。在这种情况下,您可以使用所有需要的容器和数据类型(std :: map,std :: string)来保存每个客户端的数据。如你所见,没有任何malloc:
struct client {
std::string a;
std::string b;
};
std::map<long, client> clients;
extern "C" {
long initClient(long* clientid, char* a = "", char* b = "") {
// if you need generate clientid you can use static atomic long
static std::atomic_long id(0);
clients[*clientid = ++id] = client{ a, b };
return *clientid;
}
long clientSet(int clientid, const char* a, const char* b) {
clients[clientid] = client{ a, b };
return clientid;
}
}
答案 1 :(得分:0)
经过认真考虑(以及一些讨论),我们决定采用以下方式:
显然,这里的真正问题是使用int作为指针的存储。