从System :: String ^转换为LPCTSTR [英] Conversion from System::String^ to 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屋!