у меня есть программа с двумя текстовыми полями и одной кнопкой. Программа копирует файл, путь которого назначен в первом текстовом окне в файл, путь которого, соответственно, во втором. Проблема возникает далее.
string a = text1->Text;
string b = text2->Text;
CopyFileA(a.c_str(), b.c_str(), true);
Я понимаю, что ошибка тут в том, что я не могу присвоить переменной типа string значение basic_string.
Как это сделать?
P.S. Я знаю, что вопрос ламерский, просто я недавно перешёл с дельфи на С++, тем более на интерфейсное конструирование в .NET.
Здравствуйте, 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.
Здравствуйте, 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>
Здравствуйте, 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>>
Ещё компилятор мне пишет:
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
Вызывая 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;
«Мы с тобой в чудеса не верим, Оттого их у нас не бывает…»
Здравствуйте, 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 аргумент, не ждите хороших результатов.
Спасибо! Теперь компилятор не ругается. Однако копирования файла не происходит. str1 передаётся значение, не равное textBox1->Text.
Например:
истинное значение: "1.txt"
переданное: "⸱硴t"
Мне кажется это и есть причина. Но как исправить эту ошибку?
Здравствуйте, Almanax, Вы писали:
A>Спасибо! Теперь компилятор не ругается. Однако копирования файла не происходит. str1 передаётся значение, не равное textBox1->Text. A>Например: A>истинное значение: "1.txt" A>переданное: "⸱硴t" A>Мне кажется это и есть причина. Но как исправить эту ошибку?