C/C++ - 传递给 DLL 中函数的指针
C/C++ - Pointer passed to function in DLL
假设我的DLL中有以下函数:
void TestFunction(int type, void* data)
现在,该函数是从加载该 DLL 的应用程序调用的。应用程序初始化一个结构,并将指向该结构的指针发送到该函数:
SampleStruct strc;
TestFunction(DT_SS, &ss);
目前为止,一切都好。现在困扰我的是如何用另一种结构替换内存中的 strcc 变量。如果我在我的 dll 中执行以下操作:
SampleStruct dllstrcc;
data = &dllstrcc;
数据现在将指向新的 DLLSTRCC 结构,但是当它存在函数并且控件返回到应用程序时,strc 仍将指向第一个结构。如何在不分配每个字段的情况下将应用程序的结构替换为 dll 中的结构:
data.vara = dllstrcc.vara;
data.varb = dllstrcc.varb;
data.varc = dllstrcc.varc;
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。
您可以将函数更改为
void *func(int,void *)
并返回新结构 - 但请注意,它必须使用 new 或 malloc 在堆上分配,然后由调用方使用 free 或 delete 释放
顺便说一句,默认赋值运算符不做你需要的吗?
sampleStruct newStruct;
sampleStruct *tmp=(sampleStruct *)data;
*tmp=newStruct;
你是用 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
的引用。但是,在尝试之前,您可能需要了解内存处理和内存泄漏。
- Visual c ++,使用字符串引用/指针调用 dll 函数
- 在 Microsoft Access SQL 中调用自定义 DLL 函数时传递的内存地址无效
- 调用 "project" 函数和调用 DLL 函数之间的区别
- 代码在 msvcrt .dll函数上设置断点失败
- VB.NET DLL中的C++DLL函数复制
- 在python-ctypes中声明变量并传递给dll函数
- 从 Python 调用 Windows DLL 函数时出错
- 调用 dll 函数时"Run-Time Check Failure #0 - The value of ESP"
- 列出 C# 中的 non-.NET DLL 函数
- 基本 DLL 函数
- 如何在不可修改的源代码中使用 DLL 函数?
- 对需要双精度数组和结构作为输入C++ DLL 函数的 C# 调用
- WScript.CreateObject 在调用 C++ COM dll 函数时返回空
- 如何在 lua cpp 模块中调用托管 c++ dll 函数
- 测试C++ DLL 函数
- 从 C# GUI 将 char * 参数传递给C++ dll 函数
- 使用指针调用C++ DLL 函数
- 在C++中导入 DLL 函数
- #VALUE!在 64 位 Excel 中调用 DLL 函数 (C++) 时
- 如何从 UWP 应用调用"libheif.dll"函数