nguyenvan.son Ответов: 3

Конкатенация wchar_t* unicode в C++ для создания XLL excel?


<pre>// Concatenate two wchar_t*
void mergeWChar(wchar_t*& dest, const wchar_t* source) {
	if (dest == nullptr) {
		dest = const_cast<wchar_t*>(source);
		return;
	}

	wchar_t *newdest = (wchar_t*)malloc((wcslen(dest) + wcslen(source) + 1) * sizeof *newdest); //thay + 1 bằng + 0
	wcscpy(newdest, dest);      // the *_s functions are useless here
	wcscat(newdest, source);    // as you know that newdest point to
	// a long enough buffer
	dest = newdest;

}



А затем я создаю функцию и регистрирую ее с помощью UB
<pre lang="c++">
<pre>__declspec(dllexport) LPXLOPER12 sorachu(double so)
{
	static XLOPER12  xResult;
	xResult.xltype = xltypeStr;

		
	wchar_t* msg = nullptr;
	wchar_t* wcs = L"Sơn";
	wchar_t* wcs1 = L"Văn";
		
	mergeWChar(msg, wcs);	
	mergeWChar(msg, wcs1);
	
	xResult.val.str = msg;

	return (LPXLOPER12)&xResult;
}



Откройте Excel
Тип "=sorachu(123)"
Результат: ơnVăn...........................

Что я уже пробовал:

If I change <pre>wchar_t* wcs = L"Sơn";
является
wchar_t* wcs = L"\006Sơn";
тогда результаты = Sơn Văn" >>> TRUE

Как изменить L "\ 006" автоматически при изменении переменных wcs или wcs1.
Помогите мне, пожалуйста.

3 Ответов

Рейтинг:
13

nguyenvan.son

Я думаю, что mergeWChar-это правда, и я пробую его в VS 2013, это нормально (с консолью).

но это ошибка, когда вы запускаете его в XLL Excel.

PS: "Sơn" не "сын"
(символ Юникода )


Рейтинг:
1

Rick York

Я попробовал этот код в VS2017, и он работал правильно. Я внес лишь незначительные изменения.

void mergeWChar( wchar_t*& dest, const wchar_t* source )
{
    if( dest == nullptr )
    {
        dest = const_cast<wchar_t*>( source );
        return;
    }

    size_t count = wcslen( dest ) + wcslen( source ) + 1;
    wchar_t * newdest = (wchar_t*)malloc( count * sizeof( wchar_t ) );
    wcscpy( newdest, dest );
    wcscat( newdest, source );

    // a long enough buffer
    dest = newdest;
}

void DoMergeCharTest()
{
    wchar_t* msg = nullptr;
    wchar_t* wcs1 = _T( "Son" );
    wchar_t* wcs2 = _T( "Van" );

    trace( _T( "MergeCharTest : '%s' and '%s'\n" ), wcs1, wcs2 );

    mergeWChar( msg, wcs1 );
    mergeWChar( msg, wcs2 );

    trace( _T( "result is '%s'\n" ), msg );

    free( msg );
}
Выход был такой :
MergeCharTest : 'Son' and 'Van'
result is 'SonVan'


Рейтинг:
0

nguyenvan.son

Моя проблема заключается в __declspec(dllexport) LPXLOPER12 sorachu(double so) для XLL Excel.