2010-02-18 35 views
8

lỗi C2664: 'strcpy': không thể chuyển đổi thông số 1 từ 'TCHAR *' thành 'char *' mã:Tại sao không thể chuyển đổi TCHAR * để char *

LPCTSTR name, DWORD value 
strcpy (&this->valueName[0], name); 

lỗi C2664: 'strlen' : không thể chuyển đổi thông số 1 từ 'LPCTSTR' thành 'const char *'

LPCTSTR name; 
strlen (name)  

Mã trên đây hoạt động tốt trong một dự án khác, tôi không thể tìm thấy lý do tại sao nó không hoạt động trong Dự án MS VS2010.

Trả lời

13

Bạn cần sử dụng chức năng như wcstombs khi _UNICODE được xác định. Hoặc là hoặc chỉ sử dụng _tcslen (Xem dưới Bản đồ định tuyến chung văn bản) trên chuỗi TCHAR và trình biên dịch sẽ chuyển nó sang strlen hoặc wcslen tùy thuộc vào việc bạn đang sử dụng unicode hay không.

+1

Bài đăng đó vừa lưu tôi một vài giờ. Mặc định cho các dự án C++ mới là sử dụng bộ ký tự unicode. Tắt tính năng này, sửa các lỗi này. –

+0

Cảm ơn bạn đã liên kết. wcslen đã làm việc ở đây cho một LPCTSTR – rogerdpack

7

Có lẽ vì TCHAR được định nghĩa là một char trong một trong các dự án của bạn, nhưng không phải trong một trong các dự án của bạn, nhưng không phải trong một dự án VS2010, nơi nó có thể là wchar_t.

Nếu dự án của bạn định nghĩa UNICODE/_UNICODE, giống như xác định nó là một bản dựng Unicode trong cài đặt dự án, TCHAR sẽ là wchar_t. Bạn cần phải quyết định xem có nên sử dụng Unicode hay không và nếu bạn làm như vậy, bạn cần phải thay đổi các cuộc gọi thông thường thành strncpy et al thành các tương đương rộng-char hoặc sử dụng các biến thể t thay đổi giống như TCHARs làm. Nhìn vào sự trợ giúp cho strncpy hoặc các chức năng khác để xem những gì các rộng hoặc t-biến thể được gọi là.

Bạn cũng có thể xem MSDN cho các cuộc gọi như strcpy, tại đây bạn có thể thấy phiên bản char rộng được gọi là wcscpy và phiên bản t được gọi là _tcscpy. Tôi khuyên bạn nên gắn bó với các phiên bản t nếu bạn định sử dụng mã trong các dự án khác nhau hoặc sử dụng UNICODE hay không, hoặc đưa ra quyết định sáng suốt mà bạn sẽ sử dụng và sau đó gắn bó với điều đó. Điều nào tốt hơn phụ thuộc vào kịch bản của bạn mà tôi muốn nói và có thể gọi một số ý kiến ​​"tôn giáo" ...

+0

nếu có, làm cách nào để khắc phục? – Christoferw

+0

@Christoferw: Tôi đã cập nhật câu trả lời của mình để cung cấp cho bạn một con trỏ về cách giải quyết vấn đề này. Viết bình luận khác nếu bạn cần thêm trợ giúp. – villintehaspam

+0

Nhưng tôi không có dự án unicode .... – Christoferw

3

Dự án của bạn có phải là dự án unicode không? Nếu vậy, tôi tin rằng TCHAR sẽ tương đương với wchar_t thay vì char làm cho các lần chuyển đổi của bạn không hợp lệ. See here để biết thêm thông tin.

+0

Không, đó là một dự án Multibyte – Christoferw

+0

Vâng rõ ràng là không hoặc bạn sẽ không gặp vấn đề này ... – Goz

+0

Nó được chọn tại các thiết lập dự án trong Visual Studio: Bộ ký tự: Sử dụng bộ ký tự nhiều byte – Christoferw

4

Dưới đây là một số mã mà sẽ làm các trick cho bạn, ban đầu nó được đưa lên www.wincli.com/?p=72 nhưng ở đây tôi đóng gói nó vào một lớp học nhỏ :)

class char_args 
{ 
private: 
char **l_argn; 
int arg_num; 

int wstrlen(_TCHAR * wstr) 
{ 
    int l_idx = 0; 
    while (((char*)wstr)[l_idx] != 0) l_idx += 2; 
    return l_idx; 
} 

// Allocate char string and copy TCHAR->char->string 
char *wstrdup(_TCHAR *wSrc) 
{ 
    int l_idx = 0; 
    int l_len = wstrlen(wSrc); 
    char *l_nstr = (char *)malloc(l_len); 
    if (l_nstr) { 
     do { 
      l_nstr[l_idx] = (char)wSrc[l_idx]; 
      l_idx++; 
     } while ((char)wSrc[l_idx] != 0); 
    } 
    l_nstr[l_idx] = 0; 
    return l_nstr; 
} 

char_args & operator=(const char_args&); // does not allow assignment of class 
char_args(const char_args&); // does not allow copy construction 

public: 
char_args(int argcc, _TCHAR* argv[]) : arg_num(argcc) 
{ 
    l_argn = (char **)malloc(argcc *sizeof(char*)); 
    for (int idx = 0; idx < argcc; idx++) l_argn[idx] = wstrdup(argv[idx]); 
} 

~char_args() 
{ 
    for(int idx = 0; idx < arg_num; idx++) if (l_argn[idx]) free(l_argn[idx]); 
    free(l_argn); 
} 

const char * operator[](const int &i) 
{ 
    if (i < arg_num) return l_argn[i]; else return 0; 
} 

const int argc() { return arg_num; } 
}; 

đây là một minh họa về việc sử dụng mã:

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    char_args C_ARGV(argc, argv); 
    for(int i = 0; i < C_ARGV.argc(); i++) cout << C_ARGV[i] << endl; 
} 
Các vấn đề liên quan