سؤال

وأنا جديدة على C ++، لذلك قد يكون هذا السؤال noobish. لدي الدالة التالية:

#define SAFECOPYLEN(dest, src, maxlen)                               \
{                                                                    \
    strncpy_s(dest, maxlen, src, _TRUNCATE);                          \
    dest[maxlen-1] = '\0';                                            \
}

short _stdcall CreateCustomer(char* AccountNo)
{
    char tmpAccountNumber[9];
    SAFECOPYLEN(tmpAccountNumber, AccountNo, 9);
    BSTR strAccountNumber = SysAllocStringByteLen(tmpAccountNUmber, 9);

    //Continue with other stuff here.
}

عند I تصحيح من خلال هذا الرمز، أمرر في الحساب رقم "A101683" على سبيل المثال. عندما تفعل ذلك الجزء SysAllocStringByteLen ()، يصبح رقم الحساب مجموعة من الرموز الصينية ...

وأي شخص يمكن أن يلقي بعض الضوء على هذا؟

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

المحلول

SysAllocStringByteLen هو المقصود لأنه عندما كنت تقوم بإنشاء BSTR التي تحتوي على البيانات الثنائية، سلاسل ليس الفعلية - يتم تنفيذ أي ANSI إلى تحويل يونيكود. وهذا ما يفسر لماذا يظهر المصحح السلسلة كما تحتوي على حرف ما يبدو الصينية، أنها تحاول تفسير سلسلة ANSI نسخها في BSTR ك unicode. ربما يجب عليك استخدام SysAllocString بدلا من ذلك - <الإضراب> هذا سيتم تحويل سلسلة بشكل صحيح إلى يونيكود يجب تمريرها سلسلة يونيكود. إذا كنت تعمل مع النص الفعلي، وهذا هو وظيفة يجب أن تستخدم.

نصائح أخرى

وأولا وقبل كل شيء، هناك مشكلة مع السطر الذي يحتوي SAFECOPYLEN. انها مفقودة ')'، وأنه ليس من الواضح ما يفترض القيام به.

والمسألة الثانية هي أن كنت لا تستخدم AccountNo في أي مكان في هذا القانون. tmpAccountNumber على المكدس، ويمكن أن يكون أي شيء في ذلك.

وBSTR هم صفائف الأحرف مزدوجة البايت وبالتالي لا يمكنك فقط نسخ شار * مجموعة إلى ذلك. بدلا من تمريرها "A12123" محاولة L"A12323".

short _stdcall CreateCustomer(wchar_t* AccountNo)
{
wchar_t tmpAccountNumber[9];
wcscpy(tmpAccountNumber[9], AccountNo);
BSTR strAccountNumber = SysAllocStringByteLen(tmpAccountNUmber, 9);

//Continue with other stuff here.
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top