Проблема с const char*
От: Almanax  
Дата: 29.12.07 17:46
Оценка:
у меня есть программа с двумя текстовыми полями и одной кнопкой. Программа копирует файл, путь которого назначен в первом текстовом окне в файл, путь которого, соответственно, во втором. Проблема возникает далее.
string a = text1->Text;
string b = text2->Text;
CopyFileA(a.c_str(), b.c_str(), true);

Я понимаю, что ошибка тут в том, что я не могу присвоить переменной типа string значение basic_string.
Как это сделать?
P.S. Я знаю, что вопрос ламерский, просто я недавно перешёл с дельфи на С++, тем более на интерфейсное конструирование в .NET.
Re: Проблема с const char*
От: meerius Канада  
Дата: 29.12.07 18:41
Оценка:
Здравствуйте, Almanax, Вы писали:

A>у меня есть программа с двумя текстовыми полями и одной кнопкой. Программа копирует файл, путь которого назначен в первом текстовом окне в файл, путь которого, соответственно, во втором. Проблема возникает далее.

A>
A>string a = text1->Text;
A>string b = text2->Text;
A>CopyFileA(a.c_str(), b.c_str(), true);
A>

A>Я понимаю, что ошибка тут в том, что я не могу присвоить переменной типа string значение basic_string.
A>Как это сделать?
A>P.S. Я знаю, что вопрос ламерский, просто я недавно перешёл с дельфи на С++, тем более на интерфейсное конструирование в .NET.

Так?
LPCTSTR str1 = reinterpret_cast<LPCTSTR>(static_cast<void*>(Marshal::StringToHGlobalAnsi(text1->Text)));
LPCTSTR str2 = reinterpret_cast<LPCTSTR>(static_cast<void*>(Marshal::StringToHGlobalAnsi(text2->Text)));
CopyFile(str1, str2, true);
«Мы с тобой в чудеса не верим, Оттого их у нас не бывает…»
Re[2]: Проблема с const char*
От: Almanax  
Дата: 29.12.07 21:09
Оценка:
Здравствуйте, meerius, Вы писали:

M>Здравствуйте, Almanax, Вы писали:


A>>у меня есть программа с двумя текстовыми полями и одной кнопкой. Программа копирует файл, путь которого назначен в первом текстовом окне в файл, путь которого, соответственно, во втором. Проблема возникает далее.

A>>
A>>string a = text1->Text;
A>>string b = text2->Text;
A>>CopyFileA(a.c_str(), b.c_str(), true);
A>>

A>>Я понимаю, что ошибка тут в том, что я не могу присвоить переменной типа string значение basic_string.
A>>Как это сделать?
A>>P.S. Я знаю, что вопрос ламерский, просто я недавно перешёл с дельфи на С++, тем более на интерфейсное конструирование в .NET.

M>Так?

M>
M>LPCTSTR str1 = reinterpret_cast<LPCTSTR>(static_cast<void*>(Marshal::StringToHGlobalAnsi(text1->Text)));
M>LPCTSTR str2 = reinterpret_cast<LPCTSTR>(static_cast<void*>(Marshal::StringToHGlobalAnsi(text2->Text)));
M>CopyFile(str1, str2, true);
M>


Огромное спасибо! Однако я хотел бы, чтобы работала именно CopyFileA. Я буду использовать потом const char*.
Re[3]: Проблема с const char*
От: Almanax  
Дата: 29.12.07 21:22
Оценка:
Здравствуйте, Almanax, Вы писали:

A>Здравствуйте, meerius, Вы писали:


M>>Здравствуйте, Almanax, Вы писали:


A>>>у меня есть программа с двумя текстовыми полями и одной кнопкой. Программа копирует файл, путь которого назначен в первом текстовом окне в файл, путь которого, соответственно, во втором. Проблема возникает далее.

A>>>
A>>>string a = text1->Text;
A>>>string b = text2->Text;
A>>>CopyFileA(a.c_str(), b.c_str(), true);
A>>>

A>>>Я понимаю, что ошибка тут в том, что я не могу присвоить переменной типа string значение basic_string.
A>>>Как это сделать?
A>>>P.S. Я знаю, что вопрос ламерский, просто я недавно перешёл с дельфи на С++, тем более на интерфейсное конструирование в .NET.

M>>Так?

M>>
M>>LPCTSTR str1 = reinterpret_cast<LPCTSTR>(static_cast<void*>(Marshal::StringToHGlobalAnsi(text1->Text)));
M>>LPCTSTR str2 = reinterpret_cast<LPCTSTR>(static_cast<void*>(Marshal::StringToHGlobalAnsi(text2->Text)));
M>>CopyFile(str1, str2, true);
M>>


Ещё компилятор мне пишет:
Error 4 error C2653: 'Marshal' : is not a class or namespace name c:\users\almanax\documents\visual studio 2008\projects\ovgallery\ovgallery\welcome.h 813 ovGallery
Error 5 error C3861: 'StringToHGlobalAnsi': identifier not found c:\users\almanax\documents\visual studio 2008\projects\ovgallery\ovgallery\welcome.h 813 ovGallery
Error 6 error C2653: 'Marshal' : is not a class or namespace name c:\users\almanax\documents\visual studio 2008\projects\ovgallery\ovgallery\welcome.h 814 ovGallery
Error 7 error C3861: 'StringToHGlobalAnsi': identifier not found c:\users\almanax\documents\visual studio 2008\projects\ovgallery\ovgallery\welcome.h 814 ovGallery
Re[4]: Проблема с const char*
От: meerius Канада  
Дата: 30.12.07 09:13
Оценка:
Здравствуйте, Almanax:

Вызывая CopyFile маршалинг сам вызовит CopyFileA, потому что у Вас LPCTSTR, если бы у Вас был указатель на UNICOD строку, то маршалинг вызвал бы CopyFileW, поэтому вызывать CopyFileA явно, думаю не стоит, хотя можно, если хотите.

A>Ещё компилятор мне пишет:

A>Error 4 error C2653: 'Marshal' : is not a class or namespace name c:\users\almanax\documents\visual studio 2008\projects\ovgallery\ovgallery\welcome.h 813 ovGallery
A>Error 5 error C3861: 'StringToHGlobalAnsi': identifier not found c:\users\almanax\documents\visual studio 2008\projects\ovgallery\ovgallery\welcome.h 813 ovGallery
A>Error 6 error C2653: 'Marshal' : is not a class or namespace name c:\users\almanax\documents\visual studio 2008\projects\ovgallery\ovgallery\welcome.h 814 ovGallery
A>Error 7 error C3861: 'StringToHGlobalAnsi': identifier not found c:\users\almanax\documents\visual studio 2008\projects\ovgallery\ovgallery\welcome.h 814 ovGallery

Добавте пространство имен:
using namespace System::Runtime::InteropServices;
«Мы с тобой в чудеса не верим, Оттого их у нас не бывает…»
Re[5]: Проблема с const char*
От: meerius Канада  
Дата: 30.12.07 10:07
Оценка:
Здравствуйте, meerius, Вы писали:

M>Здравствуйте, Almanax:


M>Вызывая CopyFile маршалинг сам вызовит CopyFileA, потому что у Вас LPCTSTR, если бы у Вас был указатель на UNICOD строку, то маршалинг вызвал бы CopyFileW, поэтому вызывать CopyFileA явно, думаю не стоит, хотя можно, если хотите.


Здесь неточно,прошу прощения.

Давайте так: В Dll функции CopyFile вообще нет, а есть только CopyFileA и CopyFileW. Вызвав CopyFile, маршалинг подменет ее на одну и этих финкций, в зависимости от аргумента. Если аргумент в UNICODE, то маршалинг вызовет CopyFileW, если аргумент в ANSI, то маршалинг вызовет ее ANSI версию, тоесть CopyFileA.
LPCTSTR зависит от настроек проекта, если в настройках указан UNICODE, то имеем указатель на UNICODE строку, если в настройках ANSI, то имеем указатель на строку в ANSI, соответсвенно. Поэтому не вызывайте CopyFileA и CopyFileW явно, дайте это сделать маршалингу, это его задача.
В вашем случае, в настройках проекта, пологаю, указан UNICODE(значение по умолчанию), следовательно LPCTSTR будет указателем на UNICODE строку. Вызвав CopyFileA(ANSI версию функции) и передав в нее UNICODE аргумент, не ждите хороших результатов.

кстати, можно еще так:

LPCTSTR str1 = reinterpret_cast<LPCTSTR>(Marshal::StringToHGlobalAnsi(textBox1->Text).ToPointer());
LPCTSTR str2 = reinterpret_cast<LPCTSTR>(Marshal::StringToHGlobalAnsi(textBox2->Text).ToPointer());


Удачи
«Мы с тобой в чудеса не верим, Оттого их у нас не бывает…»
Re[6]: Проблема с const char*
От: meerius Канада  
Дата: 30.12.07 10:16
Оценка:
Все же вот так
LPCTSTR str1 = reinterpret_cast<LPCTSTR>(Marshal::StringToHGlobalAuto(textBox1->Text).ToPointer());
LPCTSTR str2 = reinterpret_cast<LPCTSTR>(Marshal::StringToHGlobalAuto(textBox2->Text).ToPointer());
«Мы с тобой в чудеса не верим, Оттого их у нас не бывает…»
Re[7]: Проблема с const char*
От: Almanax  
Дата: 30.12.07 12:22
Оценка:
Здравствуйте, meerius, Вы писали:



M>Все же вот так

M>
M>LPCTSTR str1 = reinterpret_cast<LPCTSTR>(Marshal::StringToHGlobalAuto(textBox1->Text).ToPointer());
M>LPCTSTR str2 = reinterpret_cast<LPCTSTR>(Marshal::StringToHGlobalAuto(textBox2->Text).ToPointer());
M>



Спасибо! Теперь компилятор не ругается. Однако копирования файла не происходит. str1 передаётся значение, не равное textBox1->Text.
Например:
истинное значение: "1.txt"
переданное: "⸱硴t"
Мне кажется это и есть причина. Но как исправить эту ошибку?
Re[8]: Проблема с const char*
От: meerius Канада  
Дата: 30.12.07 12:42
Оценка:
Здравствуйте, Almanax, Вы писали:

A>Спасибо! Теперь компилятор не ругается. Однако копирования файла не происходит. str1 передаётся значение, не равное textBox1->Text.

A>Например:
A>истинное значение: "1.txt"
A>переданное: "⸱硴t"
A>Мне кажется это и есть причина. Но как исправить эту ошибку?

Так пробовали?
LPCTSTR str1 = reinterpret_cast<LPCTSTR>(Marshal::StringToHGlobalAuto(textBox1->Text).ToPointer());
LPCTSTR str2 = reinterpret_cast<LPCTSTR>(Marshal::StringToHGlobalAuto(textBox2->Text).ToPointer());
CopyFile(str1,str2,true);


Может так?
const char * str1 = reinterpret_cast<const char *>(Marshal::StringToHGlobalAnsi(textBox1->Text).ToPointer());
const char * str2 = reinterpret_cast<const char *>(Marshal::StringToHGlobalAnsi(textBox2->Text).ToPointer());
CopyFileA(str1,str2,true);

Как Вы хотели, но не рекомендую
«Мы с тобой в чудеса не верим, Оттого их у нас не бывает…»
Re[9]: Проблема с const char*
От: Almanax  
Дата: 30.12.07 12:58
Оценка:
Здравствуйте, meerius, Вы писали:
M>Так пробовали?
M>
M>LPCTSTR str1 = reinterpret_cast<LPCTSTR>(Marshal::StringToHGlobalAuto(textBox1->Text).ToPointer());
M>LPCTSTR str2 = reinterpret_cast<LPCTSTR>(Marshal::StringToHGlobalAuto(textBox2->Text).ToPointer());
M>CopyFile(str1,str2,true);
M>


M>Может так?

M>
M>const char * str1 = reinterpret_cast<const char *>(Marshal::StringToHGlobalAnsi(textBox1->Text).ToPointer());
M>const char * str2 = reinterpret_cast<const char *>(Marshal::StringToHGlobalAnsi(textBox2->Text).ToPointer());
M>CopyFileA(str1,str2,true);
M>

M>Как Вы хотели, но не рекомендую


Первый вариант не сработал. С const char* всё удалось. Спасибо и с новым годом!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.