我有一个C ++ DLL函数,它接收一个char *并返回一个char *。
DLL函数的定义是:
char * scanImage( char * fileDir){
string dir(fileDir);
string cvStr = cvScan(dir);
char * scanReturn = &cvStr[0];
cout << scanReturn << endl;
return (scanReturn);
}
客户端功能是:
int main()
{
char * ret;
ret = scanImage("files/stu2/1.bmp");
cout << ret << endl;
return 0;
}
现在 DLL函数的 cout 打印正确的输出,这意味着正在传递参数而没有任何问题。但客户端功能的cout打印出类似这样的内容 -
我打印 ret [i] 进行测试。并且总是在范围内返回 -35 。并且strlen(ret)&gt;的strlen(scanReturn)。
对于参数和返回,我使用 std :: string 而不是char *。这非常有效。但我不能使用字符串(我想稍后将这个DLL与VB.NET应用程序一起使用,字符串不会对此有用,或将会是)。
现在该如何解决这个问题?我正在使用 Visual C ++ 在Visual Studio 2017 IDE中编译DLL和Client程序。
更新
char * scanImage( char * fileDir)
{
string dir(fileDir);
string cvStr = cvScan(dir);
char * scanReturn;
scanReturn = (char*)malloc(sizeof(char)* cvStr.size());
scanReturn = &cvStr[0];
cout << "DLL Output: " << endl << scanReturn << endl;
return (scanReturn);
}
为scanReturn动态分配内存。但我仍然遇到同样的问题。
答案 0 :(得分:2)
可能的解决方案:
char* scanImage(char* fileDir)
{
std::string dir(fileDir); // dir is in the scope of scanImage
std::string cvStr = cvScan(dir); // cvStr is in the scope of scanImage
auto scanReturn = (char*)malloc(sizeof(char) * (cvStr.length() + 1)); // scanReturn will stay after you returned from scanImage, ensure it's big enough
strcpy(scanReturn, cvStr); // copy content of the (local) string cvStr to scanReturn
cout << "DLL Output: " << endl << scanReturn << endl;
return scanReturn; // return the POINTER to the memory, malloc gave us
}
http://www.cplusplus.com/reference/cstring/strcpy/ http://www.cplusplus.com/reference/cstdlib/malloc/
答案 1 :(得分:0)
也许不是最佳解决方案,但您可以使用内置std::copy()
method将字符串的副本复制为char*
。
char* scanReturn = new char[cvStr.size() + 1];
std::copy(cvStr.begin(), cvStr.end(), scanReturn);
scanReturn[str.size()] = '\0'; //Null-terminate the string.
return scanReturn;
这使您(更多)可以控制新分配的内存,但这也意味着当您完成字符串时,必须通过delete[]
释放内存(这可能会变得有点困难)在VB.NET中使用它时。
int main()
{
char * ret;
ret = scanImage("files/stu2/1.bmp");
cout << ret << endl;
delete[] ret; //Free the string's memory when you're no longer using it.
return 0;
}
答案 2 :(得分:-1)
此问题已解决。并且如果它在将来帮助任何人的话,发布解决方案 -
DLL函数 -
char * scanImage(char * fileDir)
{
string dir(fileDir);
string cvStr = cvScan(dir);
char * scanReturn;
scanReturn = (char*) CoTaskMemAlloc((cvStr.size() + 1) * sizeof(char));
strcpy(scanReturn, cvStr.c_str());
cout << "DLL Output: " << endl << scanReturn <<endl;
return scanReturn;
}
客户端功能 -
int dll_client()
{
char * ret = scanImage("files/stu2/1.bmp");
cout << endl << ret << endl;
return 0;
}