如何在Win32 c ++ Dll中连接int和char *并返回char *?

时间:2015-11-13 15:56:27

标签: c++ dll

我使用visual studio 2012编写了一个win32 DLL。

我的函数返回类型是char *:

extern "C" TESTDLL_API char* SelectColor()
{

}

我想在我的主应用程序(C#)中返回字符串:

[return: MarshalAs(UnmanagedType.LPStr)]
[DllImport("TESTDll.dll", CharSet = CharSet.Auto, SetLastError = true, CallingConvention = CallingConvention.Cdecl)]
public static extern string SelectColor();

在SelectColor方法的主体中我必须连接一些char *和int。 我现在测试了这些代码:

char* cid0 = GetCpuID(0);
char* cid1 = GetCpuID(1);
char* result = new char[1000];
sprintf(result,"%s%s", result ,cid0);
sprintf(result,"%s%s", result ,cid1);
return result;

这会返回错误的字符串;

char* cid0 = GetCpuID(0);
char* cid1 = GetCpuID(1);
char * result = (char*)calloc(strlen(cid0) + strlen(cid1) + 1, sizeof(char));
strcat(result, cid0);
strcat(result, cid1);
return result;

这将失败;

char* cid0 = GetCpuID(0);
char* cid1 = GetCpuID(1);
stringstream ss;
ss << cid0 << cid1 << number;
return (char*)ss.str().c_str();

返回空字符串;

我必须做什么? 抱歉英文不好。 感谢。

2 个答案:

答案 0 :(得分:2)

我猜:

char* cid0 = GetCpuID(0);
char* cid1 = GetCpuID(1);
char* result = new char[1000];
sprintf(result,"%s%s", result ,cid0);
sprintf(result,"%s%s", result ,cid1);
return result;

你想要这样做;

char* cid0 = GetCpuID(0);
char* cid1 = GetCpuID(1);
char* result = new char[1000];
sprintf(result,"%s%s", cid0,cid1);
return result;

答案 1 :(得分:1)

如果绝对无法更改函数的签名,则必须返回指向静态内存缓冲区的指针,以确保指针不会泄露(如果是new[]和{{1}示例)或过早释放(在calloc()示例的情况下),例如:

stringstream

或者:

char result[1000];

extern "C" TESTDLL_API char* SelectColor()
{
    char* cid0 = GetCpuID(0);
    char* cid1 = GetCpuID(1);
    StringCchPrintfA(result, 1000, "%s%s", cid0, cid1);
    return result;
}

请注意,这不是线程安全的。如果多个线程需要同时调用该函数,请在线程本地存储中使用内存缓冲区,例如:

std::string result;

extern "C" TESTDLL_API char* SelectColor()
{
    char* cid0 = GetCpuID(0);
    char* cid1 = GetCpuID(1);
    std::ostringstream oss;
    oss << cid0 << cid1;
    result = oss.str();
    return result.c_str();
}

更新:如果缓冲区的内容永远不会改变,您可以初始化缓冲区一次,并按原样继续返回:

__declspec(thread) char result[1000];

extern "C" TESTDLL_API char* SelectColor()
{
    char* cid0 = GetCpuID(0);
    char* cid1 = GetCpuID(1);
    StringCchPrintfA(result, 1000, "%s%s", cid0, cid1);
    return result;
}

或者:

struct sResult
{
    char buffer[1000];

    sResult()
    {
        char* cid0 = GetCpuID(0);
        char* cid1 = GetCpuID(1);
        StringCchPrintfA(buffer, 1000, "%s%s", cid0, cid1);
    }
};

extern "C" TESTDLL_API char* SelectColor()
{
    static sResult result;
    return result.buffer;
}