C++ 如何在Win32 c+中连接int和char*并返回char*+;动态链接库?

C++ 如何在Win32 c+中连接int和char*并返回char*+;动态链接库?,c++,dll,C++,Dll,我使用visual studio 2012编写了一个win32 DLL 我的函数返回类型是char*: extern "C" TESTDLL_API char* SelectColor() { } 我想在我的主应用程序(C#)中返回字符串: 在SelectColor方法的主体中,我必须包含一些char*和int。 到目前为止,我一直在测试这些代码: char* cid0 = GetCpuID(0); char* cid1 = GetCpuID(1); char* result = new c

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

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

extern "C" TESTDLL_API char* SelectColor()
{

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

在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();
char*cid0=GetCpuID(0);
char*cid1=GetCpuID(1);
细流ss;
ss我想:

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;
我想:

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;

如果绝对无法更改函数的签名,则必须返回指向静态内存缓冲区的指针,以确保指针不会泄漏(对于
new[]
calloc()
示例)或过早释放(对于
stringstream
示例),例如:

或:

更新:如果缓冲区的内容从未更改,则可以初始化缓冲区一次,然后继续按原样返回:

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;
}
或:


如果绝对无法更改函数的签名,则必须返回指向静态内存缓冲区的指针,以确保指针不会泄漏(对于
new[]
calloc()
示例)或过早释放(对于
stringstream
示例),例如:

或:

更新:如果缓冲区的内容从未更改,则可以初始化缓冲区一次,然后继续按原样返回:

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;
}
或:


如果您正在为Win32 API编程,我建议您使用strsafe.h函数,如StringCbCat、StringCchCat等。请参阅GetCPUID的代码?我的函数返回类型是char:*——这就是问题所在。相反,让调用方传递一个缓冲区,然后用数据填充它。如果需要参考点,有多少Windows API函数返回
char*
?我打赌很少有人会这样做。不幸的是,我必须返回字符串,并且不能更改返回类型!。GetCPUID是一个返回char*的函数。我正在用.NET2和c语言编程。@Ali.M返回指向用户传递给您的缓冲区的指针。底线是让调用方负责给您一个缓冲区,而不是代码分配和导致内存泄漏。您可以返回它们传递给您的指针,因为它是指向客户端自己设置的缓冲区的指针。但更重要的是,如果返回char*,那么为什么没有Windows API函数这么做呢?相反,您会看到API函数的功能与我所说的类似(或者按照milevyo的答案所建议的执行)。@Ali.M您在问题中的最后一次尝试失败,因为返回了指向局部变量的指针。因此,您可以通过让用户向您传递一个缓冲区和一个大小来消除整个问题,而不是与潜在的内存泄漏(谁将负责释放该内存?)作斗争,并返回指向局部变量的指针。那么您就不必头疼了——您所做的就是填充缓冲区(根据给定的大小),然后返回指针。如果您是为Win32 API编程的,我建议使用strsafe.h函数,如StringCbCat、StringCchCat等。看看GetCPUID的代码是什么?我的函数返回类型是char:*——这就是问题所在。相反,让调用方传递一个缓冲区,然后用数据填充它。如果需要参考点,有多少Windows API函数返回
char*
?我打赌很少有人会这样做。不幸的是,我必须返回字符串,并且不能更改返回类型!。GetCPUID是一个返回char*的函数。我正在用.NET2和c语言编程。@Ali.M返回指向用户传递给您的缓冲区的指针。底线是让调用方负责给您一个缓冲区,而不是代码分配和导致内存泄漏。您可以返回它们传递给您的指针,因为它是指向客户端自己设置的缓冲区的指针。但更重要的是,如果返回char*,那么为什么没有Windows API函数这么做呢?相反,您会看到API函数的功能与我所说的类似(或者按照milevyo的答案所建议的执行)。@Ali.M您在问题中的最后一次尝试失败,因为返回了指向局部变量的指针。因此,您可以通过让用户向您传递一个缓冲区和一个大小来消除整个问题,而不是与潜在的内存泄漏(谁将负责释放该内存?)作斗争,并返回指向局部变量的指针。那么你就不用头疼了——你所要做的就是填充缓冲区(根据给定的大小),然后返回指针。谢谢,但我不能更改main方法原型。函数没有任何参数,必须返回字符串@我给出的答案是这样做的实际方法。除非您以某种方法管理所有字符串分配和释放(提供另一个DLL函数来释放内存等),否则您所追求的几乎永远不会完成。正如我的另一条评论所建议的,无论您的需求如何,返回指向局部变量的指针都不是一个选项。函数能否在主应用程序中返回除char*和get string以外的类型?谢谢,但我无法更改主方法原型。函数没有任何参数,必须返回字符串@我给出的答案是这样做的实际方法。除非您以某种方法管理所有字符串分配和释放(提供另一个DLL函数来释放内存等),否则您所追求的几乎永远不会完成。正如我的另一条评论所建议的,返回指向局部变量的指针不是一个选项,无论您的需求如何。函数能否在主应用程序中返回除char*和get string以外的类型?您正在将
结果
变量放入全局范围。我理解这一点,因为GetCpuID(0)&&GetCpuID(0)永远不会改变。把它放进去怎么样
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;
}
static char result[1000];

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved)
{
    if (fdwReason == DLL_PROCESS_ATTACH)
    {
        char* cid0 = GetCpuID(0);
        char* cid1 = GetCpuID(1);
        StringCchPrintfA(buffer, 1000, "%s%s", cid0, cid1);
    }
    return TRUE;
};

extern "C" TESTDLL_API char* SelectColor()
{
    return result;
}