![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
zmejg |
|
|||
Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 18.7.2007 Репутация: нет Всего: нет |
Привет всем. Кто может помочь с такой проблемой?
....есть программа на C++. В некоторой строке содержится содержимое XML документа, т.е. char* xmlText = "<?xml version=\"1.0\"?><root>..... "; нужно преобразовать данную строку с помощью имеющегося xsl. Но msxsl.exe может принимать исходные данные только из файла, либо со стандартного ввода. Вопрос в том - как можно передать эти данные из строки? Понятно, что можно сделать временный файл tmp.xml, туда записать xmlText,а затем сделать вызов наподобие следующего: WinExec("msxsl.exe -tmp.xml - myxsl.xsl -o result.xml"); ...а потом удалить tmp.xml. Но мне это кажется как-то криво. Еще интересно, можно ли результат получить тоже в виде строки? |
|||
|
||||
SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 4 Всего: 91 |
А прямо и не получиться, пока не избавишься от msxsl и не напишешь свою программу, а также не изменишь способ хранения xml документа. Выход я вижу таким: - качаем libxml2 и курим исходники xsltproc (аналог msxsl для linux) - берем свой .cpp файл с xmlем, подключаем к нему libxml2, делаем преобразование, генерим строку и записываем в новый .cpp файл. А вообще я так и не понял задачу до конца. Это было бы логично только если есть сотни-тысячи cpp файлов с такими xmlями, или сотни-тысячи строк в одном файле с xmlText1, xmlText2...xmlText10000. Это сообщение отредактировал(а) SABROG - 5.12.2007, 17:05 |
|||
|
||||
zmejg |
|
|||
Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 18.7.2007 Репутация: нет Всего: нет |
задача такая: есть cgi приложение на C++. Весь результат работы приложения собирается в одной строке вроде xmlText, затем строка подается на стандартный вывод. xmlText сейчас содержит ссылку на файл xsl. Естествнно преобразование в этом случае происходит на стороне клиента (клиент в специальном диалоговом окне будет указывать путь к xsl файлу). Задача сделать это преобразование на стороне сервера.
...xml документ вообще нигде не хранится я не понимаю почему вы меня не понимаете, ведь xmlText содержит не статические данные, а для каждого запроса имеет свое содержимое. а где можно взять libxml2, мне для винды нужно естественно Это сообщение отредактировал(а) zmejg - 5.12.2007, 17:36 |
|||
|
||||
SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 4 Всего: 91 |
Наверно потому, что я не нашел в первом посте слово CGI. Ну раз программа ваша, то проблемы не вижу, libxml2 кросплатформенный. Собирается через gcc, msvc и mingw.
Может быть есть смысл поработать с msxml.dll, не знаю есть ли там методы для работы с xsl преобразованием. Не люблю поделки мелкософта. |
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
msxsl это демо программа - врапер над MSXML ActiveX компонентом. Ее исходники есть на сайте MS (в MSDN), только они там хитро закопанны, удалось найти только через google :( Берешь исходники, правишь под свои нужды или зовешь MSXML напрямую. |
|||
|
||||
zmejg |
|
|||
Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 18.7.2007 Репутация: нет Всего: нет |
скажите, как нужно компилировать все это добро?
и какие именно изменения и куда нужно вносить? |
|||
|
||||
xvr |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
nmake
Main находится в файле main.cxx (как ни странно ![]() Разбор коммандной строки находится в файлах cmdline.cxx/hxx Собственно преобразование - в файле transfrm.cxx Имена файлов: Входной - _bstrInput Шаблон - _bstrStylesheet Выходной - _bstrOutput Файловые потоки содержатся в файлах seqstrm.cxx/hxx Можно заменить реализацию файловых потоков, что бы они читали строки из памяти, в качестве имени файла они будут принимать указатели на строки (в текстовом виде) Функцию main надо переименовать во что-нибудь отличное от main Функцию mainCRTStartup - убрать. В функции HRESULT ParseCommandLine::Parse() {return Parse(GetCommandLineW());} - GetCommandLineW заменить на свою коммандную строку (приготовленную в памяти) и позвать бывшую main. Да, всю эту бодягу прилинковать к своей программе |
||||
|
|||||
zmejg |
|
|||
Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 18.7.2007 Репутация: нет Всего: нет |
а как пользоваться nmake?
я понимаю что есть такие вещи как google, msdn и т.д... но так слишком сложно искать что-то конкретное. Может в двух словах напишете как собирать проекты с помощью make файлов |
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Заходишь в директорию с сорцами, убеждаешься, что у тебя настроенны пути на VC, набираешь nmake Если хочешь более подробно - загляни в makefile (файл такой, в директории с сорцами) |
|||
|
||||
maxim1000 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
такое ощущение, что этого никто не заметил если использовать CreateProcess, перенаправить стандартный ввод на что угодно не составляет большой проблемы... -------------------- qqq |
|||
|
||||
SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 4 Всего: 91 |
Можно, конечно, CreatePipe сделать, но это не правильный выход из ситуации. Это все-равно что принимать данные через SMS, мобильный телефон положить на сканнер, а FineReader будет расшифровывать, а плагин для FineReader'a обрабатывать.
|
|||
|
||||
zmejg |
|
|||
Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 18.7.2007 Репутация: нет Всего: нет |
видимо двух слов недостаточно...
в командной строке в директории msxslsrc пишу : C:\>msxslsrc> nmake.exe makefile ...и ничего не происходит. А что должно быть? Как скомпилировать исходный проект хотя бы для начала без моих изменений? |
|||
|
||||
jonie |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 15 Всего: 118 |
что значит ничего не происходит?? тупо черный экран и мигающий курсор чтоли? и вообще НИЧЕГО?
-------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
zmejg |
|
|||
Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 18.7.2007 Репутация: нет Всего: нет |
написано что-то вроде:
makefile is up-to-date ...что это означает? |
|||
|
||||
xvr |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
makefile здесь лишний, надо просто nmake без параметров
Это значит, что ты сказал nmake, что хочешь собрать makefile, и nmake сообщил, что makefile вполне новый - нет никаких новых файлов, от которых бы он зависел. |
||||
|
|||||
zmejg |
|
|||
Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 18.7.2007 Репутация: нет Всего: нет |
А сейчас что не так?
C:\msxslsrc>nmake.exe получаю: "mc" не является внутренней или внешней командой, исполняемой программой или пакетным файлом. NMAKE: fatal error U1077: 'C:\windows\system32\cmd.exe: return code '0x1' Stop. |
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Это означает, что в makefile'е для чего-то завется утилита mc. Что это за утилита и для чего завется я не в курсе. Насколько я помню, makefile там весьма не тривиальный, автор занимался уменьшением размера exe'ника (makefile'а сейчас под рукой нет, посмотреть не могу) Посмотрел - mc это Message Compiler. Должен быть в VS (у VS 2003 лежит в C:\Program Files\Microsoft Visual Studio .NET 2003\Common7\Tools\Bin), убедись, что PATH туда смотрит. Это сообщение отредактировал(а) xvr - 18.12.2007, 21:20 |
|||
|
||||
zmejg |
|
|||
Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 18.7.2007 Репутация: нет Всего: нет |
у меня 2005-ая студия. Для mc.exe поправил переменную path. Потом тоже самое сделал для
cl.exe Сейчас ошибка такая: core.cxx: fatal error C1902: Program database manager mismatch; please check your installation |
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Похоже на внутреннюю ошибку студии. Сотри все промежуточные файлы (особенно в директориях Debug & Release) и попробуй еще раз. |
|||
|
||||
zmejg |
|
|||
Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 18.7.2007 Репутация: нет Всего: нет |
сорри, какие промежуточные файлы?...у меня в сорсах нету никаких Debug и Release. В сорсах только код и ресурсы какие-то.
|
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Тогда посмотри нет ли в PATH других версий VS - очень похоже на несоотвествие версий внутренних тулзов VS. Кстати, попробуй запустить vcvars32.bat из Common?\Tools директории перед запуском nmake - он настраивает все переменные окружения, необходимые для работы с коммандной строки. Вообще makefile там заточен под VC 6.0 |
|||
|
||||
zmejg |
|
|||
Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 18.7.2007 Репутация: нет Всего: нет |
других версий нет и никогда не было.
vcvar32.bat запустил. Теперь такая ошибка: NMAKE : fatal error U1077 '"C:\Program files\Microsoft Visual Studio 2005\VC\bin\cl.EXE"' : return code '0x0000135' Stop. |
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Обламалась компиляция, что ей надо по приведенным сообщениям непонятно :( Еще какие-нибудь сообщения (или лог файлы) были? |
|||
|
||||
zmejg |
|
|||
Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 18.7.2007 Репутация: нет Всего: нет |
не было. после запуска vcvar32.bat только такое сообщение и больше ничего.
|
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Что то у тебя с инсталяцией студии не то :( Взял VS 2003 (2005 нет, увы), распаковал сорцы, скопировал vsvars32.bat из студии и запустил с командной строки: vsvars32.bat & nmake - все откомпилилось, получен файл debug\msxsl.exe У тебя вообще cl.exe с коммандной строки нормально запускается? |
|||
|
||||
zmejg |
|
|||
Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 18.7.2007 Репутация: нет Всего: нет |
точно. такая команда:
C:\>cl.exe выдала ошибку - не удается найти mspdb80.dll. Нашел эту dll-ку, установил на нее переменную path. Теперь при запуске nmake ошибка такая: c:\msxslsrc\core.hxx(10) : fatal error C1034 : windows.h: no include path set nmake : fatal error U1077: C:\Program files\Microsoft Visual Studio 2005\VC\bin\cl.EXE"': return code '0x2' Stop. |
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
vsvars32.bat должен устанавливать ВСЕ переменные окружения, необходимые для работы компилятора и пр. По всей видимости они не устанавливаются, или vsvars32.bat взят не оттуда, или установка VS 2005 кривая (например C++ не установлен, или Platform SDK не установлен, что врядли) |
|||
|
||||
zmejg |
|
|||
Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 18.7.2007 Репутация: нет Всего: нет |
c vsvars32.bat разобрался. Не сразу понял, что её просто нужно запускать из каталога с сорсами.
Блин, занудное это дело. Теперь ошибка такая: main.cxx(84) : error C2220: warning treated as error - no 'object' file generated main.cxx(84) : warning C4996: '_itow' was declared deprecated C:\Program files\Microsoft Visual Studio 2005\VC\include\stdlib.h(612) : see declaration of '_itow' Message : This function or variable may be unsafe. Consider using _itow_s instead. To disable deprecation? use _CRT_SECURE_NO_DEPRECATE. See online help for details. (и так не только в main.cxx но и во всех других, где используется _itow) ...сначала попробовал все вызовы _itow заменить на _itow_s. При этом компиляция нормально проходит, а вот при линковании ошибка - unresolved extarnal symbol : _itow_s А если во всех файлах где используется _itow определить макрос: #define _CRT_SECURE_NO_DEPRECATE ...то ничего не происходит - те же самые ошибки. что можно сделать? |
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Не могу проверить - нет VS 2005 под рукой, но похоже, что этот дефайн _CRT_SECURE_NO_DEPRECATE надо задать в makefile'е (добавить в CFLAGS или CPPFLAGS -D=_CRT_SECURE_NO_DEPRECATE) |
|||
|
||||
zmejg |
|
|||
Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 18.7.2007 Репутация: нет Всего: нет |
че-то никак...
в список флагов CXXFLAGS (CFLAGS - такого нету) добавил _CRT_SECURE_NO_DEPRECATE запускаю nmake: cl : Command line warning D9002 : ignoring unknown option '/_CRT_SECURE_NO_DEPRECATE' (кстати тот же самый варнинг получаю почти для всех остальных опций которые уже есть) а как узнать в каком .lib файле находится определение функции _itow_s? |
|||
|
||||
xvr |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Надо добавлять -D_CRT_SECURE_NO_DEPRECATE
Смотреть в help'е |
||||
|
|||||
zmejg |
|
|||
Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 18.7.2007 Репутация: нет Всего: нет |
добавил. я так понял это равносильно определению макроса:
#define _CRT_SECURE_NO_DEPRECATE ...нету эффекта. может искал не там, но в хелпе не нашел где определена _itow_s, |
|||
|
||||
xvr |
|
||||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Нашел _itow_s в MSDN (http://msdn2.microsoft.com/en-us/library/0we9x30h(VS.80).aspx):
Оттуда же
Кстати, по поводу depricated функций глянь в http://forums.microsoft.com/MSDN/ShowPost....01&SiteID=1 Это сообщение отредактировал(а) xvr - 9.1.2008, 15:55 |
||||||
|
|||||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |