【问题标题】:C/C++ - Pointer passed to function in DLLC/C++ - 指针传递给 DLL 中的函数
【发布时间】:2012-08-10 15:32:42
【问题描述】:

假设我的 DLL 中有以下函数:

void TestFunction(int type, void* data)

现在从加载该 DLL 的应用程序调用该函数。应用程序初始化一个结构并将指向该结构的指针发送给该函数:

SampleStruct strc;
TestFunction(DT_SS, &ss);

到目前为止一切顺利。现在困扰我的是如何用另一个结构替换内存中的strcc变量。如果我在我的 dll 中执行以下操作:

SampleStruct dllstrcc;
data = &dllstrcc;

data 现在将指向新的 dllstrcc 结构,但是当它存在函数并且控件返回到应用程序时 strc 仍将指向第一个结构。如何在不分配每个字段的情况下用我的 dll 结构替换应用程序的结构:

data.vara = dllstrcc.vara;
data.varb = dllstrcc.varb;
data.varc = dllstrcc.varc;

【问题讨论】:

  • 首先让我注意,听起来你正在走向未定义的行为(通过放弃指向本地数据的指针)并指出应该避免像 void* 这样的构造(不是双关语) 在 C++ 中(因为大多数情况下都是可能的)。那就是说:指针的引用/指针怎么样,可以让您替换调用者站点上的指针?
  • @Nobody 实际上这不是一个空洞*,但可以说归结为它。至于指向指针的指针,我无法控制应用程序或 dll 函数。但是函数内部的代码在我的控制之下。
  • 如果您被该界面所束缚,那么您无能为力。

标签: c++ pointers structure


【解决方案1】:

1。最简单的选择是复制整个结构:

void TestFunction(int type, void* data) {
    SampleStruct dllstrcc;
    // fill dllstrcc here...
    SampleStruct *p_ret = data;
    *p_ret = dllstrcc;
}

然后通过调用它

SampleStruct strcc;
TestFunction(type, &strcc);

好处是不用担心释放内存等问题。

2。如果真的要替换调用者的结构(要有新的结构),可以在DLL中分配一个新的结构。

void* TestFunction(int type) {
    SampleStruct* pdllstrcc = new SampleStruct();
    return pdllstrcc;
}

(我将return 新结构,因为它更容易,但如果需要,您可以使用void** data 将其通过参数传递出去。)

你可以像这样调用函数:

SampleStruct *strcc = TestFunction(type);
// do something with the struct
delete strcc;

不要忘记删除指针,否则会泄漏内存。您应该明确决定释放内存的责任,调用者的责任还是 DLL 的责任。

【讨论】:

    【解决方案2】:

    你可以把函数改成

    void *func(int,void *) 
    

    并返回新结构 - 但请注意,它必须使用 new 或 malloc 在堆上分配,然后由调用者使用 free 或 delete 释放

    顺便说一句,默认的赋值运算符不满足你的需要吗?

    sampleStruct newStruct;
    sampleStruct *tmp=(sampleStruct *)data;
    *tmp=newStruct;
    

    【讨论】:

      【解决方案3】:

      你是用c还是c++编码?

      首先:如果你想这样调用函数:

      SampleStruct strc;
      TestFunction(DT_SS, &strc);
      

      你不能。替换&strc 意味着什么?您正在尝试替换结构的地址?那没有任何意义。同样在 c++ 中你不使用void *,你使用SampleStruct *

      如果你想替换某些东西,你必须这样称呼它:

      SampleStruct strc;
      SampleStruct * pstrc = & strc;
      TestFunction(DT_SS, pstrc);
      

      现在你可以用你的结果替换 pstrc,如果你这样写你的函数:

      void TestFunction(int type, SampleStruct * & data)
      

      注意&,这意味着您将指针数据作为引用传递。 现在你可以写data = & dllstrcc;,它会修改pstrc,因为data不是变量,而是对pstrc的引用。但您可能想在尝试之前了解内存处理和内存泄漏。

      【讨论】:

        猜你喜欢
        • 2017-08-30
        • 2020-12-10
        • 2011-11-18
        • 1970-01-01
        • 2019-03-12
        • 2013-09-17
        • 2011-04-17
        相关资源
        最近更新 更多