سؤال

خطأ C2664: "Strcpy": لا يمكن تحويل المعلمة 1 من "Tchar *" إلى رمز "char *":

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

خطأ C2664: 'Strlen': لا يمكن تحويل المعلمة 1 من 'lpctstr' إلى 'const char *'

LPCTSTR name; 
strlen (name)     

الكود أعلاه إلى فصل يعمل بشكل جيد في مشروع آخر ، لا يمكنني العثور على سبب عدم عمله في مشروع MS VS2010 هذا.

هل كانت مفيدة؟

المحلول

تحتاج إلى استخدام وظيفة مثل wcstombs عندما يتم تعريف _Unicode. إما ذلك أو مجرد استخدام _tcslen (انظر تحت تعيينات الروتينية النصي العام) على سلسلة TRACH وسيقوم برنامج التحويل البرمجي بنقله إلى Strlen أو WCSLEN وفقًا إذا كنت تستخدم Unicode أم لا.

نصائح أخرى

ربما لأن THACH يُعرَّف بأنه شار في أحد مشاريعك ، ولكن ليس في VS2010 ، حيث ربما يكون WCHAR_T.

إذا قام مشروعك بتعريف Unicode/_Unicode ، وهو ما يشبه تحديده على أنه بناء أحادي في إعدادات المشروع ، فسيكون Tchars wchar_t.

تحتاج أساسًا إلى تحديد ما إذا كنت ستعمل على استخدام Unicode أم لا ، وإذا كنت تفعل ذلك ، فأنت بحاجة إلى تغيير المكالمات العادية إلى Strncpy et al إلى المعادلات العريضة أو استخدام الماريس T الذين يتغيرون بنفس الطريقة التي يفعل بها Tchars. انظر إلى مساعدة strncpy أو الوظائف الأخرى لمعرفة ما يطلق عليه الأمناء الواسعون أو t.

يمكنك أيضًا النظر إلى MSDN للمكالمات مثل strcpy, ، حيث يمكنك أن ترى أن الإصدار الواسع يسمى wcscpy ويسمى الإصدار t _tcscpy. أود أن أوصيك بالالتزام بالذات T إذا كنت ستستخدم الكود في مشاريع مختلفة تستخدم Unicode أم لا ، أو لاتخاذ قرار مستنير الذي ستستخدمه ثم التمسك بذلك. أيهما يعتمد بشكل أفضل على سيناريوكم ، أود أن أقول وقد أستدعي بعض الآراء "الدينية" ...

هل مشروعك مشروع Unicode؟ إذا كان الأمر كذلك ، أعتقد TCHAR سيكون مكافئًا لـ wchar_t بدلا من char جعل محاولات التحويل الخاصة بك غير صالحة. انظر هنا لمزيد من المعلومات.

فيما يلي بعض التعليمات البرمجية التي ستقوم بالخدعة بالنسبة لك ، تم نشرها في الأصل على www.wincli.com/؟p=72 ولكن هنا قمت بتغليفها في فصل صغير :)

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; }
};

فيما يلي مظاهرة لاستخدام الرمز:

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;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top