我使用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();
返回空字符串;
我必须做什么? 抱歉英文不好。 感谢。
答案 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;
}