Đây là Microsoft typedefs được xác định tương ứng với:
LPCSTR: con trỏ null chấm dứt chuỗi const của char
LPSTR: con trỏ null chấm dứt chuỗi char của char
(thường là một bộ đệm được thông qua và sử dụng như một 'đầu ra' param)
LPCWSTR: con trỏ null chuỗi chấm dứt của const wchar_t
LPWSTR: con trỏ null t erminated chuỗi wchar_t
(thường là một bộ đệm được thông qua và sử dụng như một 'đầu ra' param)
Để "chuyển đổi" một std::string
đến một LPCSTR phụ thuộc vào bối cảnh chính xác nhưng thường gọi .c_str()
là đủ.
Tác phẩm này.
void TakesString(LPCSTR param);
void f(const std::string& param)
{
TakesString(param.c_str());
}
Lưu ý rằng bạn không nên cố gắng làm điều gì đó như thế này.
LPCSTR GetString()
{
std::string tmp("temporary");
return tmp.c_str();
}
Bộ đệm được trả về bởi .c_str()
thuộc sở hữu của std::string
dụ và sẽ chỉ có giá trị cho đến khi chuỗi được tiếp sửa đổi hoặc hủy bỏ.
Để chuyển đổi std::string
thành LPWSTR
phức tạp hơn. Muốn một số LPWSTR
ngụ ý rằng bạn cần bộ đệm có thể sửa đổi và bạn cũng cần chắc chắn rằng bạn hiểu mã hóa ký tự đang sử dụng là gì. Nếu std::string
chứa chuỗi sử dụng mã hóa mặc định của hệ thống (giả sử cửa sổ, tại đây), thì bạn có thể tìm độ dài của bộ đệm ký tự được yêu cầu và thực hiện chuyển mã bằng cách sử dụng MultiByteToWideChar
(chức năng API Win32).
ví dụ:
void f(const std:string& instr)
{
// Assumes std::string is encoded in the current Windows ANSI codepage
int bufferlen = ::MultiByteToWideChar(CP_ACP, 0, instr.c_str(), instr.size(), NULL, 0);
if (bufferlen == 0)
{
// Something went wrong. Perhaps, check GetLastError() and log.
return;
}
// Allocate new LPWSTR - must deallocate it later
LPWSTR widestr = new WCHAR[bufferlen + 1];
::MultiByteToWideChar(CP_ACP, 0, instr.c_str(), instr.size(), widestr, bufferlen);
// Ensure wide string is null terminated
widestr[bufferlen] = 0;
// Do something with widestr
delete[] widestr;
}
Điểm cầu kỳ nhỏ: trên x64 LPCSTR sẽ là một con trỏ 64 bit đến chuỗi kết thúc null (không đổi). – Joel