C ++ DLL char *返回问题

时间:2018-01-05 07:24:03

标签: c++ string pointers dll

我有一个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打印出类似这样的内容 -

Outputs

我打印 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动态分配内存。但我仍然遇到同样的问题。

3 个答案:

答案 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;
}