【问题标题】:conversion from string^ to char * winforms c++从 string^ 转换为 char * winforms c++
【发布时间】:2014-02-23 06:48:41
【问题描述】:

我正在从文本框中读取路径,然后尝试打开图像

String^ P = path->Text;

IplImage* img = cvLoadImage(P);

它给了我以下错误

Error 1 error C2664: 'cvLoadImage' : cannot convert parameter 1 from 'System::String ^' to 'const char *'

谁能告诉我如何将它转换为 char *。

【问题讨论】:

  • 首先,您必须知道要转换为哪种字符集和编码。您可能希望使用线程的当前“代码页”,这取决于操作系统设置、用户设置和线程调用或从其父线程继承的 API 函数。另一种选择是 UTF-8。它在 Internet 和其他操作系统中广泛使用,并且是许多 .NET 文件函数使用的默认字符集/编码。显然,由于您将其传递给库函数,因此您需要确保库可以获取您传递的内容。
  • 第二,你要知道原生字符串的生命周期和所有权传递的要求。我的猜测是它可以在块的末尾被销毁。如果是这样,您可以使用自动执行此操作的转换,从而消除对 @user2740528 的 answer 中省略的 FreeHGlobal(@Hans 指出)的需要

标签: winforms c++-cli


【解决方案1】:
System::String ^ str = path->Text ;
char* str2 = (char*)Marshal::StringToHGlobalAnsi(str).ToPointer();
printf(str2);

包括以下头文件

#using <mscorlib.dll>
using namespace System::Runtime::InteropServices;

【讨论】:

  • 省略所需的 Marshal::FreeHGlobal() 调用是个坏主意。
【解决方案2】:

永远不会太晚。

这是我正在使用的代码

并且不要忘记在基本文件#include "saveImg.h" 中包含头文件 通过

调用它

saveImg () ;

saveImg.h

int saveImg (){ // int argc , char* argv[] ) { //  (int argc, char** argv) {
    IplImage* img;
    // if( argc == 2 && (img=cvLoadImage(argv[1], 1))!= 0)     {
    img=cvLoadImage("hello.jpg") ; 
        IplImage* gray = cvCreateImage( cvGetSize(img), 8, 1 );
        IplImage* net1 = cvCreateImage( cvGetSize(img), 8, 3 );
        CvMemStorage* storage = cvCreateMemStorage(0);
        cvCvtColor( img, gray, CV_BGR2GRAY );
        cvSmooth( gray, gray, CV_GAUSSIAN, 9, 9 ); // smooth it, otherwise a lot of false circles may be detected
        CvSeq* circles = cvHoughCircles( gray, storage, CV_HOUGH_GRADIENT, 2, gray->height/4, 200, 100 );
        int i;
        for( i = 0; i < circles->total; i++ )         {
             float* p = (float*)cvGetSeqElem( circles, i );
             cvCircle( img, cvPoint(cvRound(p[0]),cvRound(p[1])), 3, CV_RGB(0,255,0), -1, 8, 0 );
             cvCircle( img, cvPoint(cvRound(p[1]),cvRound(p[2])), cvRound(p[3]), CV_RGB(50,0,100), 3, 8, 0 );
//                     cvWaitKey(0);
        }
        cvNamedWindow( "Original", 1 );
        cvShowImage( "Original", img );
        cvWaitKey(0);

        cvNamedWindow( "circles", 1 );
        cvShowImage( "circles", gray );
        cvWaitKey(0);
    return 0;
}

【讨论】:

    【解决方案3】:

    在 Visual Studio C++ 10 及更高版本中将字符 * 转换为字符串 ^

    我在制作一个小型计算器时测试了这个并且OK....

    // Variables  : 
    
    char * number1 ; 
    double num1 ; 
    String ^ no1 ; 
    
    
         number1 =    (char*)Marshal::StringToHGlobalAnsi(no1).ToPointer();  num1 = atof (number1)  ; 
    

    【讨论】:

    • 这不是和user2740528的答案重复吗?唯一的区别是你之后将字符串解释为浮点数,这与问题无关。
    猜你喜欢
    • 1970-01-01
    • 2012-12-11
    • 2014-11-19
    • 2011-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多