我的任务是创建一个包含很多函数的DLL。这些函数的具体实现实际上相当简单,但一般(或更好的:初始)设置让我头疼,我还不能理解它。下面是我要实现的两个函数:

long initClient(long* client, char* a = "", char* b = "");
long clientSet(int client, const char* a, const char* b);

第一个函数将设置一个客户机(可以是0..n,每个客户机都有内部状态数据),因此它需要以某种方式在内部跟踪与客户机相关的数据。现在每当我调用clientSet(第二个函数)时,我需要将从initClient得到的整数值(long*client)传递给函数,这样它就可以识别正确的客户端数据结构并更改这些数据。
现在真正的问题是:我如何正确地做到这一点?
我目前的解决方案是保存一个客户机的内部列表及其相关的数据/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");

这看起来像是我应该做的吗?

最佳答案

你需要导出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;
  }
}

10-08 13:15