【发布时间】:2018-11-06 20:58:52
【问题描述】:
我已经能够实现一个导入 C++ DLL 函数并正确使用它来获取所需计算值的程序。我正在使用 intptr 指针将 char* 值返回到 VB.net。
它工作正常,但是,我似乎无法休息或清除存储函数结果的内存空间。当我第一次调用该函数时,它给了我正确的答案,当第二次调用它时,它给了我第一个和第二个答案。
以下是我的代码的相关部分:
CPM.cpp - 在 cpp 文件中计算返回变量的函数
char* CPMfn(char* sdatabase, int project_num)
{
/* Retrieve data from database and calculate CPM for the selected project number*/
char* testvector = getCPM(sdatabase, project_num);
return testvector;
}
CPM.h - 导出函数的头文件
#pragma once
#ifdef CPM_EXPORTS
#define CPM_API __declspec(dllexport)
#else
#define CPM_API __declspec(dllimport)
#endif
extern "C" CPM_API char* CPMfn(char*, int);
VB.net代码导入DLL,声明函数并使用
'' Import C++ CPM Calculation function from CPM DLL
<DllImport("CPM.dll", CallingConvention:=CallingConvention.Cdecl)>
Private Shared Function CPMfn(ByVal dbstring As Char(), ByVal task As Int32) As System.IntPtr
End Function
'' Get CPM results from DLL function with database location string and selected project number
CPMresults = CPMfn(DBString, Val(Project_IDTextBox.Text))
CPMvalues = Marshal.PtrToStringAnsi(CPMresults)
If CPMvalues.Length() = 0 Then
MsgBox("No tasks for seleccted project")
Else
MsgBox(CPMvalues) ' Show CPM values
End If
当我连续运行它时,字符串会越来越长,即第 4 个函数调用将返回项目 1、2、3 和 4 的值。
过去几个小时,我在网上查了一下,试图弄清楚如何从 C++ DLL 返回 char*,然后如何清除 intptr。
我只是对建议的解决方案没有任何运气。我真的很感激一些帮助。
谢谢!
【问题讨论】:
-
与其自己编组,为什么不让框架为你做呢?我不确定它作为返回类型是如何工作的,但我相信
char*可以映射到StringBuilder(const char*映射到String)。我不认为改变它会解决你的实际问题(但我可能是错的),也许getCPM重用了相同的字符数组?你有这种方法的某种文档吗? -
char*可以映射到string而不是StringBuilder,如果它被分配了CoTaskMemAlloc()并被编组为UnmanagedType.LPStr
标签: c++ vb.net visual-c++ char marshalling