C++ DLL 字符参数

Posted

技术标签:

【中文标题】C++ DLL 字符参数【英文标题】:C++ DLL char paramteters 【发布时间】:2014-10-15 17:11:25 【问题描述】:

我想从 C 程序中调用这个 c++ 函数。我想使用 char* errorMessage 返回错误消息。当我在代码中执行 return errorMessage 时,我会在返回后在我的 C 应用程序中获得 char 指针。但如果我尝试 errorMessage = SafeStringHeap(string("File name was empty.")); 我总是在我的 C 应用程序中得到一个空指针。

我尝试在 c 应用程序中使用以下文本调用我的函数:

char* errorMessage = NULL;
TAFMessage = (*TAFParseMessageFile)(NULL, errorMessage);

功能:

static char* SafeStringHeap(string message)

    //Save string on the heap
    char * cstr = new char[message.length() + 1];
    strcpy_s(cstr, message.length() + 1, message.c_str());

    return cstr;


extern "C" __declspec(dllexport) const char* TAFParseMessageFile(const char* fileName, char* errorMessage)

    if (fileName == NULL)
    
        errorMessage = SafeStringHeap(string("File name was empty."));
        return errorMessage;
    

    return NULL;    // TODO: set errorMessage

【问题讨论】:

为什么会传入错误信息?您认为 SafeStringHeap 函数中分配的内存会发生什么变化?谁来解除分配?什么时候?也许最好传入一个实际的 char 数组,以便您可以将错误消息写入其中? 你的意思是以下?:char errorMessage[100]; TAFMessage = (*TAFParseMessageFile)(NULL, errorMessage); 【参考方案1】:

受限于上面提出的其他问题。尝试将您的 errorMessage 参数更改为 char **(指向 char 指针的指针),然后执行以下操作:

*errorMessage = SafeStringHeap(...)

并且在调用函数时传递&errorMessage

【讨论】:

因为当你想操纵一个参数的值时,即使用它作为一个 OUT 变量,你需要添加额外的间接层。例如:使用 int 类型调用函数,如果您希望函数将 int 参数的操作投射回调用者,那么您必须传递该 int 的地址,以便工作函数可以放置新值进入该参数的调用者占位符。 顺便说一句,如果您的问题已得到回答,那么建议您通过接受答案将其标记为已回答。

以上是关于C++ DLL 字符参数的主要内容,如果未能解决你的问题,请参考以下文章

将 C# 字符串作为参数发送到非托管 C++ DLL 函数

C++ 将字符串传递到 C# dll

如何使用ctypes,python将字符串参数传递给C++函数

C#调用C++写的DLL总结

C# 调用C++ DLL,而c++函数的有一个参数需要是null,该怎么传递?

字符串数组 C# 与 C++ dll 的互操作性;从 C# 到 C++ dll 的字符串数组,它设置数据并将其发送回 c#