2009-07-24 3 views
0

Я используюКак преобразовать тип для следующего сценария?

TCHAR buffer [MAX_SIZE];

после некоторого множества шагов, я Джеттиг относительного пути папки говорит, напр:

C: \ Microsoft.NET \ Framework \ v1.0.037 \

Поскольку выше путь в буфере типа TCHAR и я пытаюсь СЦЕПИТЬ «regasm.exe»

После прилагая мне нужно преобразовать путь к LPCTSTR, так как мне нужно, чтобы передать его CreateProcess(), который принимает тип LPCTSTR в качестве аргумента

, тогда компилятор дает ошибку. Я пробовал, но досадовал.

может ли один помочь мне в этом аспекте ....

+0

Какова была ошибка компилятора? –

+0

Вы делаете что-то вроде буфера + «RegAsm.exe», что приводит к ошибке компилятора? – Naveen

+0

да точно то же самое – Cute

ответ

1

Проблема заключается в том, что TCHAR и CreateProcess являются макросами, которые расширяются по-разному в зависимости от того, компилируете ли вы для Unicode или нет. Предостережение заключается в том, что GetCORSystemDirectory() будет принимать только буфер Unicode.Чтобы избавиться от этих проблем ANSI/Unicode, напишите эту часть кода явно для Unicode.

Вместо TCHAR используйте WCHAR для буфера. Вместо CreateProcess() используйте CreateProcessW() - он с радостью примет буфер Unicode. Используйте wcscat() для конкатенации строк.

Нечто подобное (обработка ошибок опущена):

WCHAR buffer[MAX_PATH + 1]; 
DWORD realLength; 
GetCORSystemDirectory(buffer, MAX_PATH, &realLength); 
*(buffer + realLength) = 0;// Don't forget to null-terminate the string 
wcscat(buffer, L"regasm.exe"); 
CreateProcessW(/*pass buffer here*/); 
+0

Но когда использование CreateProcessW() не может преобразовать STARTUPINFO & si в LPSTARTUPINFOW, поэтому я использовал (LPSTARTUPINFOW) и si в CreateProcW(), тогда он работает нормально ..... Спасибо, очень много для ur suuport .. – Cute

+0

Вы должны вместо этого объявить переменную типа STARTUPINFOW - это было бы правильнее. – sharptooth

0

Если вы хотите, чтобы сделать вашу жизнь проще, я всегда предлагаю использовать зЬй :: строку, то при вызове функции CreateProcess() просто сделать:

std::string myPath = "somePath"; 
LPCTSTR lpBuf = reinterpret_cast<LPCTSTR>(myPath.c_str()); 

Не проверено, но это, вероятно, должно работать, если вы все еще получаете сообщение об ошибке, хорошая публикация кода будет полезна.

Обратите внимание, что это может быть сложнее, если вы используете Unicode.

+0

YUP его work.Hurrey ........ , но любая вещь вреда использованием reinterpret_cast ... – Cute

+1

Никогда не используйте этот реинтерпрет. LPCTSTR lpBuf = myPath.c_str(); также будет работать, если система настроена правильно. – Totonga

+1

Этого никогда не должно быть сделано. Если string :: c_str() - это ANSI, то это reinterpret_cast, несомненно, приведет к передаче мусора в дальнейшем называемом CreateProcess. Это не проблема в этой проблеме, просто попросите компилятор не показывать сообщение об ошибке. – sharptooth

0

Я полагаю, из-за того, что вы получите сообщение об ошибке, что вы работаете с Unicode ... В этом случае вы можете захотеть взглянуть на mbstowcs и wcstombs функций.

Дополнительная информация действительно необходима, чтобы иметь возможность правильно ответить.

2
_tcscat_s 

- родственный метод для TCHAR. Это зависит от типа TCHAR на _WINKODE & _MBCS препроцессора swithch и будет разрешено для strcat_s или wcscat_s.

TCHAR buffer[MAX_SIZE] = _T("c:\Microsoft.NET\Framework\v1.0.037\"); 
_tcscat_s(buffer, MAX_SIZE, _T("RegAsm.exe")); 

но это очень хороший старый стиль C. Поэтому, пока вы используете TCHAR, я бы предположил, что вы также используете материал MFC. Таким образом, использование CString, на которое также влияет _UNICODE & _MBCS, также решит вашу проблему.

CString buffer; 
buffer = _T("c:\Microsoft.NET\Framework\v1.0.037\"); 
buffer += _T("RegAsm.exe"); 
CreateProcess(buffer, .. 

станд :: строка или станд :: wstring не поможет, потому что они не меняют свое поведение, связанное с препроцессором переключился, но если вы используете CreateProcessA или CreateProcessW вы также можете использовать зЬй :: строку или зЬй :: wstring.

+0

+1 для предложения использовать CString – Naveen

0

Когда вы делаете буфер + «RegAsm.exe», это будет похоже на добавление двух указателей (поскольку распад массивов в указатели и «RegAsm.exe» будет const TCHAR *), следовательно, вы получите ошибку компилятора. То, что вы хотите, это конкатенация строк. Используйте _tcscat или или защищенную версию (как заявлено в MSDN) _tcscat_s функция выполнения конкатенации.

Смежные вопросы