标题:求助: 函数从C++/CLR控制台程序,移植到C++/CLR winForm窗口程序 引发异常 ...
只看楼主
追梦人zmrghy
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:399
专家分:190
注 册:2021-4-9
结帖率:97.22%
已结贴  问题点数:20 回复次数:6 
求助: 函数从C++/CLR控制台程序,移植到C++/CLR winForm窗口程序 引发异常,不知如何解决。
0x00007FFD36C1B3F7 (ntdll.dll)处(位于 WstrTochar.exe 中)引发的异常: 0xC0000005: 读取位置 0xFFFFFFFFFFFFFFFF 时发生访问冲突。

就想把wstring转成char* 网上找来了转换函数。
程序代码:
wstring转char*
#include <xstring>  
#include <iostream>  
#include <comdef.h>  
using namespace std;  
char* ws2s(const wstring& ws)  
{  
_bstr_t t = ws.c_str();   
char* pchar = (char*)t;   
string result = pchar;  
char* charTmp = new char;  
strcpy(charTmp,result.c_str());  
pchar = NULL;  
delete pchar;  
return charTmp;  
}  


测试过了C++控制台程序 和 C++/CLR控制台程序 都没有问题。
移植到C++/CLR winForm窗口程序 引发异常,不知如何解决。




main.cpp 代码
程序代码:
#include "Form1.h"
using namespace WstrTochar;

[STAThread]
int main(cli::array<System::String^>^ args)
{
    Application::EnableVisualStyles();
    Application::Run(gcnew Form1());  //Form1是窗体的名称

    return 0;
}


Form1.h代码
程序代码:
#pragma once
#include"transverter.h"
namespace WstrTochar {

    using namespace System;
    using namespace System::ComponentModel;
    using namespace System::Collections;
    using namespace System::Windows::Forms;
    using namespace System::Data;
    using namespace System::Drawing;

    public ref class Form1 : public System::Windows::Forms::Form
    {
    public:
        Form1(void)
        {
            InitializeComponent();

        }

    protected:

        ~Form1()
        {
            if (components)
            {
                delete components;
            }
        }

    private:

        System::ComponentModel::Container ^components;

#pragma region Windows Form Designer generated code

        void InitializeComponent(void)
        {
            this->components = gcnew System::ComponentModel::Container();
            this->Size = System::Drawing::Size(300,300);
            this->Text = L"Form1";
            this->Padding = System::Windows::Forms::Padding(0);
            this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
        }
#pragma endregion
    };
}



transverter.h代码
程序代码:
#pragma once
#include <xstring>  
#include <iostream>  
#include <comdef.h>  

using namespace std;
char* ws2s(const wstring& ws)
{
    _bstr_t t = ws.c_str();
    char* pchar = (char*)t;
    string result = pchar;
    char* charTmp = new char;
    strcpy(charTmp, result.c_str());
    pchar = NULL;
    delete pchar;
    return charTmp;
}



项目文件
WstrTochar.rar (626.49 KB)




这样就可以运行了。。。
是第10行代码出了问题。
char* pchar = (char*)t;


请教 各位大神,这个问题如何解决呀!!!
搜索更多相关主题的帖子: namespace char System C++ using 
2022-12-10 02:00
追梦人zmrghy
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:399
专家分:190
注 册:2021-4-9
得分:0 




大概知道,是内存非法(越界)读写了。
可是,为什么函数在C++控制台 和 C++/CLR控制台程序都正常。
函数移植到C++/CLR winForm窗口程序 ,就出现内存非法(越界)读写了。

原因,和解决方法。。。。
2022-12-10 13:39
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:20 
其它不谈,仅看你这段代码
char* ws2s(const wstring& ws)  
{  
_bstr_t t = ws.c_str();
char* pchar = (char*)t;
string result = pchar;
char* charTmp = new char;
strcpy(charTmp,result.c_str());
pchar = NULL;
delete pchar;
return charTmp;
}

你为了完成一个 宽字符串 转 多字节字符串 的简单功能,引入了屎尿肿库COM,再通过不必要的 _bstr_t 间接调用 _com_util::ConvertBSTRToString?九曲回肠十八弯根本不足以形容。
而且你的代码中有很多无法想象的错误,「无法想象」就是对方不知道怎么开口解释
我自己就不写了(嫌COM脏),我帮你查个M$家官方的用法给你看看:https://learn.

在C++中,wstring转string有太多办法,但之前我还是想知道你为什么需要这个功能。
2022-12-10 13:40
追梦人zmrghy
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:399
专家分:190
注 册:2021-4-9
得分:0 
回复 3楼 rjsp
把wstring转char*。
是为了使用system(char*)函数。。。

system(不支持wstring)。
system( FFmpeg 视频转码 )


system("ffmpeg -i \"输入视频文件\" -acodec copy -vcodec copy -absf aac_adtstoasc \"输出视频文件\"")
2022-12-10 14:03
追梦人zmrghy
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:399
专家分:190
注 册:2021-4-9
得分:0 
回复 3楼 rjsp
程序代码:
// ConvertBSTRToString.cpp
#include <comutil.h>
#include <stdio.h>

#pragma comment(lib, "comsuppw.lib")

int main() {
   BSTR bstrText = ::SysAllocString(L"Test");
   wprintf_s(L"BSTR text: %s\n", bstrText);

   char* lpszText2 = _com_util::ConvertBSTRToString(bstrText);
   printf_s("char * text: %s\n", lpszText2);

   SysFreeString(bstrText);
   delete[] lpszText2;
}



差不多呀,使用 wprintf_s 代替了 char* pchar = (char*) _bstr_t赋值。。。
2022-12-10 14:28
追梦人zmrghy
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:399
专家分:190
注 册:2021-4-9
得分:0 
回复 3楼 rjsp

刚刚发现,自己又画蛇添足了。
没想到不只是system()一个函数,还有 _wsystem()和_tsystem()...
2022-12-10 15:04
追梦人zmrghy
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:399
专家分:190
注 册:2021-4-9
得分:0 
回复 3楼 rjsp
M$家官方的用法给你看看:https://learn.
你帮我找来的方法,也是一样呀。。。。





就算自己,把wstring 转成 char* 再使用system()是画蛇添足。
这次也应该画完,不应该半途而废,最多下次不再给“长虫”画“脚丫子”了。



终于成功了。。。
2022-12-11 00:03



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-510912-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.118379 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved