从System :: String ^转换为LPCTSTR [英] Conversion from System::String^ to LPCTSTR

查看:257
本文介绍了从System :: String ^转换为LPCTSTR的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经看到以下函数从System :: String ^转换为

const wchar_t *。我想得到一个LPCTSTR和AFAIK LPCTSTR等于

const wchar_t *。那它应该都正常吗?但我只得到第一个

字符。当我尝试做std :: wstring l_s(转换(somestring))我得到了

真正奇怪的字符进入l_s字符串表示,但是当我检查

l_s个别字符他们看起来还不错。


const wchar_t * convert(

System :: String ^ s)

{

//引脚内存因此GC在调用本机函数时无法移动

pin_ptr< const wchar_twch = PtrToStringChars(s);


返回wch;

}

I have seen the following function to convert from a System::String^ to a
const wchar_t*. I would like to get a LPCTSTR and AFAIK LPCTSTR is equal to
const wchar_t*. Then it should all work right? But I only get the first
character. And when I try to do std::wstring l_s(convert(somestring)) I get
really strange characters into l_s string representation, but when I check
l_s individual characters they look ok.

const wchar_t* convert(
System::String^ s)
{
// Pin memory so GC can''t move it while native function is called
pin_ptr<const wchar_twch = PtrToStringChars(s);

return wch;
}

推荐答案

嗨Joachim!
Hi Joachim!

我想获得LPCTSTR和AFAIK LPCTSTR等于

const wchar_t *。
I would like to get a LPCTSTR and AFAIK LPCTSTR is equal to
const wchar_t*.



编号LPCTSTR不是const char *或const wchar_t *,具体取决于

UNICODE宏。


我对cenversion的首选方式是:


#include< windows.h>

#include< tchar.h>

using namespace System;

struct StringConvA

{

char * szAnsi;

StringConvA(System :: String ^ s)



szAnsi(static_cast< char *>(System :: Runtime :: Interop Services :: Marshal :: StringToHGlobalAnsi(s)。 ToPointe r()))


{}

~StringConvA()

{


System :: Runtime :: InteropServices :: Marshal :: FreeHGl obal(IntPtr(szAnsi));

}

运算符LPCSTR()const

{

返回szAnsi;

}

};


struct StringConvW < br $>
{

wchar_t * szUnicode;

StringConvW(System :: String ^ s)



szUnicode(static_cast< wchar_t *>(System :: Runtime :: I nteropServices :: Marshal :: StringToHGlobalUni(s).ToP ointer()))


{}

~StringConvW()

{


System :: Runtime :: InteropServices :: Marshal :: FreeHGl obal(IntPtr(szUnicode));

}

运算符LPCWSTR()const

{

返回szUnicode;

}

};


#ifdef _UNICODE

#define StringConvT StringConvW

#else

#define StringConvT StringConvA

#endif


然后将它用于:

#include< string>

int _tmain()

{

String ^ s =" abc";

std :: string ansi = StringConvA(s);

std :: wstring unicode = StringConvW(s);

}





#include< stdio.h>

int _tmain()

{

String ^ s =" abc";

printf("%s",(LPCSTR)StringConvA(s));

wprintf(L"%s", (LPCWSTR)StringConvW(s));

_tprintf(_T("%s"),(LPCTSTR)StringConvT(s));

返回0;

}

问候

Jochen

No. LPCTSTR ist either const char* or const wchar_t* depending on
UNICODE macro.

My prefered way for cenversion is:

#include <windows.h>
#include <tchar.h>
using namespace System;
struct StringConvA
{
char *szAnsi;
StringConvA(System::String ^s)
:
szAnsi(static_cast<char*>(System::Runtime::Interop Services::Marshal::StringToHGlobalAnsi(s).ToPointe r()))

{}
~StringConvA()
{

System::Runtime::InteropServices::Marshal::FreeHGl obal(IntPtr(szAnsi));
}
operator LPCSTR() const
{
return szAnsi;
}
};

struct StringConvW
{
wchar_t *szUnicode;
StringConvW(System::String^ s)
:
szUnicode(static_cast<wchar_t*>(System::Runtime::I nteropServices::Marshal::StringToHGlobalUni(s).ToP ointer()))

{}
~StringConvW()
{

System::Runtime::InteropServices::Marshal::FreeHGl obal(IntPtr(szUnicode));
}
operator LPCWSTR() const
{
return szUnicode;
}
};

#ifdef _UNICODE
#define StringConvT StringConvW
#else
#define StringConvT StringConvA
#endif

And then use it with:
#include <string>
int _tmain()
{
String ^s = "abc";
std::string ansi = StringConvA(s);
std::wstring unicode = StringConvW(s);
}

or

#include <stdio.h>
int _tmain()
{
String ^s = "abc";
printf("%s", (LPCSTR) StringConvA(s));
wprintf(L"%s", (LPCWSTR) StringConvW(s));
_tprintf(_T("%s"), (LPCTSTR) StringConvT(s));
return 0;
}
Greetings
Jochen


谢谢Jochen,

我仍​​然只获得第一个角色...


问候,

Joachim


Jochen Kalmbach [MVP]"写道:
Thanks Jochen,

I still only get the first character...

Regards,
Joachim

"Jochen Kalmbach [MVP]" wrote:

嗨Joachim!
Hi Joachim!

我想获得LPCTSTR和AFAIK LPCTSTR等于

const wchar_t *。
I would like to get a LPCTSTR and AFAIK LPCTSTR is equal to
const wchar_t*.



编号LPCTSTR不是const char *或const wchar_t *,具体取决于

UNICODE宏。


我对cenversion的首选方式是:


#include< windows.h>

#include< tchar.h>

using namespace System;

struct StringConvA

{

char * szAnsi;

StringConvA(System :: String ^ s)



szAnsi(static_cast< char *>(System :: Runtime :: Interop Services :: Marshal :: StringToHGlobalAnsi(s)。 ToPointe r()))


{}

~StringConvA()

{


System :: Runtime :: InteropServices :: Marshal :: FreeHGl obal(IntPtr(szAnsi));

}

运算符LPCSTR()const

{

返回szAnsi;

}

};


struct StringConvW < br $>
{

wchar_t * szUnicode;

StringConvW(System :: String ^ s)



sz Unicode(static_cast< wchar_t *>(System :: Runtime :: I nteropServices :: Marshal :: StringToHGlobalUni(s).ToP ointer()))


{}

~StringConvW()

{


System :: Runtime :: InteropServices :: Marshal :: FreeHGl obal(IntPtr(szUnicode)) ;

}

运算符LPCWSTR()const

{

返回szUnicode;

}

};


#ifdef _UNICODE

#define StringConvT StringConvW

#else

#define StringConvT StringConvA

#endif


然后将它用于:

#include< ; string>

int _tmain()

{

String ^ s =" abc";

std :: string ansi = StringConvA(s);

std :: wstring unicode = StringConvW(s);

}


或者


#include< stdio.h>

int _tmain()

{

String ^ s =" abc";

print f("%s",(LPCSTR)StringConvA(s));

wprintf(L"%s",(LPCWSTR)StringConvW(s));

_tprintf(_T("%s"),(LPCTSTR)StringConvT(s));

返回0;

}


问候

Jochen


No. LPCTSTR ist either const char* or const wchar_t* depending on
UNICODE macro.

My prefered way for cenversion is:

#include <windows.h>
#include <tchar.h>
using namespace System;
struct StringConvA
{
char *szAnsi;
StringConvA(System::String ^s)
:
szAnsi(static_cast<char*>(System::Runtime::Interop Services::Marshal::StringToHGlobalAnsi(s).ToPointe r()))

{}
~StringConvA()
{

System::Runtime::InteropServices::Marshal::FreeHGl obal(IntPtr(szAnsi));
}
operator LPCSTR() const
{
return szAnsi;
}
};

struct StringConvW
{
wchar_t *szUnicode;
StringConvW(System::String^ s)
:
szUnicode(static_cast<wchar_t*>(System::Runtime::I nteropServices::Marshal::StringToHGlobalUni(s).ToP ointer()))

{}
~StringConvW()
{

System::Runtime::InteropServices::Marshal::FreeHGl obal(IntPtr(szUnicode));
}
operator LPCWSTR() const
{
return szUnicode;
}
};

#ifdef _UNICODE
#define StringConvT StringConvW
#else
#define StringConvT StringConvA
#endif

And then use it with:
#include <string>
int _tmain()
{
String ^s = "abc";
std::string ansi = StringConvA(s);
std::wstring unicode = StringConvW(s);
}

or

#include <stdio.h>
int _tmain()
{
String ^s = "abc";
printf("%s", (LPCSTR) StringConvA(s));
wprintf(L"%s", (LPCWSTR) StringConvW(s));
_tprintf(_T("%s"), (LPCTSTR) StringConvT(s));
return 0;
}
Greetings
Jochen


const wchar_t * convert(
const wchar_t* convert(

System :: String ^ s)

{

//引脚内存因此GC在调用本机函数时无法移动

pin_ptr< const wchar_twch = PtrToStringChars(s);


返回wch;

}
System::String^ s)
{
// Pin memory so GC can''t move it while native function is called
pin_ptr<const wchar_twch = PtrToStringChars(s);

return wch;
}



这里完全滥用pin_ptr。你绝对不能使用pin_ptr作为返回

的值。


OTOH,这将有效,因为在
$时调用了wstring构造函数b $ b字符串仍然固定:


std :: wstring convert(System :: String ^ const s)

{

return std :: wstring(pin_ptr< const wchar_t>(PtrToStringChars(s)));

}

Complete misuse of pin_ptr here. You must never use a pin_ptr as a return
value.

OTOH, this will work, because the wstring constructor is called while the
string is still pinned:

std::wstring convert(System::String^ const s)
{
return std::wstring(pin_ptr<const wchar_t>(PtrToStringChars(s)));
}


这篇关于从System :: String ^转换为LPCTSTR的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆