Отправляет email-рассылки с помощью сервиса Sendsay

Инвестиции: Вопрос-Ответ

  Все выпуски  

C/C++ Вопрос-Ответ Выпуск № 31.


Информационный Канал Subscribe.Ru

C/C++ Вопрос-Ответ

Выпуск      : 31
Подписчиков : 2722
Cайт        : SoftMaker.com.ru
Архив       : C/C++ Вопрос-Ответ (архив)
В этом выпуске
Интерактивная компьютерная графика. Вводный курс на базе OpenGL.

Интерактивная компьютерная графика.
Вводный курс на базе OpenGL.


От ведущего

Здравствуйте уважаемые подписчики !

Как всегда, рад приветствовть вас на страницах этой рассылки.

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

Если вы хотите создать и вести какой либо раздел в этой рассылке - также пишите мне.

И, как всегда, вы можете задать свои вопросы по программированию на сайте в форуме.
Или обсудить их в дискуссионном листе "Программирование. форум !!!".

Многим может быть также интересна рассылка: Visual С++ - расширенное программирование, где можно прочитать описания нестандартных приемов программирования с помощъю библиотеки MFC - 'трюков', 'хаков', недокументированных функций.

С уважением, Вахтуров Виктор.

Подписчикам

Чтобы заранее разрешить возможные недоразумения, прошу Вас помнить, что вопросы публикуются в рассылке только один раз. Поэтому, если Вам не ответили в этом выпуске, или ваш вопрос не был опубликован, пришлите его еще раз. Не стоит отвечать на вопрос, который был задан в предыдущем выпуске (за исключением случая, когда он снова опубликован в этом).

Для того, чтобы задать свой вопрос, пришлите письмо, кликнув по этой ссылке.
Для того, чтобы ответить на вопрос, надо кликнуть по ссылке "ответить", расположенной под текстом вопроса.

Небольшое примечание. Господа, если Вы хотите, чтобы Ваш e-mail был опубликован в рассылке, специально и явно укажите это в письме. Иначе e-mail адреса, указанные в теле Вашего письма в рассылке опубликованы не будут.

Вопросы

Для того, чтобы задать свой вопрос, кликните этой ссылке (вопрос будет опубликован в следующем номере).
Вы можете задавать любые вопросы, касающиеся программирования на языке C и C++. Это могут быть вопросы, касающиеся как конструкций языка, применения библиотек классов, шаблонов (таких как MFC или STL), использования компиляторов, так и самой философии программирования на C или C++. Здесь нет ограничений - спрашивайте и получайте ответы.

Вопрос № 115 ( Wishmaster )

Здрасьте:))
Вы мне не подскажите что это за глюк?? Я его (а он меня) уже очень давно
мучаем...
Скажу сразу - пишу я на Visual C++.NET с OpenGL'ем.
"Appl.cpp(90) : error C2664: 'sprintf' : cannot convert parameter 2 from
'std::string' to 'const char *'
No user-defined-conversion operator available that can perform this
conversion, or the operator cannot be called"
Как от него избавиться?
Ну или собсно вот такой аналогичный глюк:
"Appl.cpp(87) : error C2664: 'auxDIBImageLoadA' : cannot convert parameter 1
from 'std::string' to 'LPCSTR'
No user-defined-conversion operator available that can perform this
conversion, or the operator cannot be called"
Заранее благодарен! Жду ответа....

Ответить на вопрос

Вопрос № 116 ( Smart )

Наверно я задаю не новый вопрос. Но пока не разобрался как это можно сделать.
Мне хотелось бы решить проблему с запуском приложения несколько раз. Точнее есть даже две задачи.

1. Сделать так, чтобы приложение запускалось только один раз. Моя программа должна запускаться из автозагрузки и окна у нее нет. Но пользователь не видит работает программа или нет (ему по сути дела должно быть все равно), но он может прост озапустить .exe файл программы. И вот надо это предотвратить.
2. Это уже просто интересно. Надо сосчитать сколько копий приложения запущено. Например Total Commander когда его запускаешь несколько раз пишет в заголовке номер. Например "[4] Total Commander".

Если кто т оподелится кусочком кода на C++ будет просто прекрасно !

Ответить на вопрос

Вопрос № 117 ( QQQz )

Подскажите пожалуйста, а как сделать в заголовке окна мигающую иконку как в браузере Maxthon ? Она там как бы переливается несколькими цветами когда идет загрузка страницы. Пишу на Visual C++.

Ответить на вопрос

Вопрос № 118 ( QQQz )

Подскажите пожалуйста, а как можно сделать такие закладки для переключения между окнами просмотра как в браузерах Opera, Mozilla, MyIE, и.т.д. ?

Ответить на вопрос

Вопрос № 119 ( Diza IX )

Hello, All !

Приветствую вас, программисты :) Есть ли кто в рассылке, кто работал с
графикой, или пишет графические приложения ?

Дайте совет plz по следующим вопросам.

- Какие есть бесплатные библиотеки для работы с файлами форматов:
gif, jpeg, png, tiff (если знаете библиотеки для работы с другими
форматами, то тоже буду рад ссылкам !). Надо уметь читать и записывать
файлы разных граф. форматов. Основная трудность - как читать сжатые
форматы, типа jpeg, а потом их записывать, выбирая еще степень сжатия.

- Поделитесь пожалуйста ссылками на документацию/мануалы/книги по работе
с БОЛЬШИМИ изображениями. Если знаете хорошие бумажные книжки по работе с
графикой, то тоже - напишите, название (можно с ISBN).
В первую очередь хочется получить информацию по работе с большими растрами.
Например, сделать качественный растровый редактор только средствами винды,
наверно не получится (тот же фотошоп по слухам имеет свой менеджер
памяти. Наверняка как то кеширует отображаемую картинку при разных
масштабах просмотра, и.т.д. Хотелось бы побольше узнать об алгоритмах
обработки растровых изображений.

- Интересуют также любые исходники на перечисленные выше темы.
Может, кто подкинет пару ссылочек на спец. ресурсы, посвященные данной
тематике ? Есть ли русскоязычные хорошие ресурсы ?

Ответить на вопрос

Ответы

Ниже приведены вопросы предыдущего выпуска и ответы на них.

Вопрос № 113 ( LifeMaker )

Мой вопрос касается технологии COM или ActiveX,
а точнее использование её в Visual C++.

Visual Basic позволяет написать следующий код:

Sub PrintDoc(filename As String)
  Dim W As Application
  Dim D As Document
  W = CreateObject("Word.Application")
  D = W.Documents.Open(filename)
  D.PrintOut
  D.Close
  W.Quit
End Sub

Как добиться аналогичного в C++?
Вопрос мой не в том, как распечатывать документ Word,
а в том, как создать ActiveX объект по символьному имени
(типа "Word.Application") и вызывать их методы?

Ответ ( 3V )

Есть решение "влоб" - получить при помощи CLSIDFromProgID CLSID нужного компонента, создать его (при помощи CoCreateInstance), затем получить интерфейс IDispatch:

if(SUCCEEDED(::CoInitialize(NULL)))
{
   CLSID clsid;

   if(SUCCEEDED(CLSIDFromProgID(OLESTR("Word.Application"),
                                &clsid)))
   {
      IUnknown *pUnknown = NULL;

      if(SUCCEEDED(::CoCreateInstance(clsid,
                                      NULL,
                                      CLSCTX_SERVER,
                                      IID_IUnknown,
                                      (void **) &pUnknown)))
      {
         IDispatch *pDispatch = NULL;

         if(SUCCEEDED(pUnknown->QueryInterface(
                                       IID_IDispatch,
                                       (void**) &pDispatch)))
         {
            // тут должен быть код для работы
            // через IDispatch::GetIDsOfNames
            // и IDispatch::Invoke
            // ...

            pDispatch->Release();
         }

         pUnknown->Release();
      }
      else
         AfxMessageBox("CoCreateInstance failed");
   }
   else
      AfxMessageBox("CLSIDFromProgID failed");
}
else
   AfxMessageBox("CoInitialize failed");

::CoUninitialize();


А потом пользовать методы IDispatch::GetIDsOfNames (для получения DISPID нужного метода по имени) и IDispatch::Invoke для исполнения этого метода.

Естественно, это работа в стиле C, и это совсем не удобно.


Можно сгенерировать обертки для соответствующих интерфейсов. Далее все описываю для среды Visual C++ 6.0.

Меню -> View -> Class Wizard (либо просто жмешь Ctrl+W)
Тычешь кнопку "Add Class". В меню выбираешь "From A Type Library".
В появившемся диалоге лезешь в директорию офиса и находишь файл, содержащий библиотеку типов для word-а.
Он по разному называется для разных версий офиса:
Word 95 - wb70en32.tlb
Word 97 - msword8.olb
Word 2000 - msword9.olb
Word 2002 - msword.olb

Кликаешь по этому файлу. Появляется диалог, в котором показано какие классы могут быть сгенерированы. Надо выбрать в списке что будет генериться. Там же можно изменить имена h и cpp файлов, в которые будут добавлены декларации и реализации этих классов, имена самих классов. Жмешь OK...
Сгенерились нужные тебе классы.

Дальше используешь эти классы.
Вот код. Я просто продублировал твой пример:

if(!AfxOleInit()) 
{
   AfxMessageBox("Could not initialize COM");
   return;
}

COleVariant vTrue((short) TRUE),
            vFalse((short) FALSE),
            vOpt((long) DISP_E_PARAMNOTFOUND, VT_ERROR);

//Start a new instance of Microsoft Word
_Application oWordApp;

if(!oWordApp.CreateDispatch("Word.Application", NULL))
{
    AfxMessageBox("CreateDispatch failed.",
                  MB_OK | MB_SETFOREGROUND);
    return;
}

//Create a new document

Documents oDocs;
_Document oDoc;

oDocs = oWordApp.GetDocuments();

oDoc = oDocs.Open(COleVariant("e:\\test.doc"),
                  vTrue,
                  vFalse,
                  vTrue,
                  vOpt, vOpt, vOpt, vOpt, vOpt,
                  vOpt, vOpt, vOpt, vOpt, vOpt,
                  vOpt, vOpt);

oDoc.PrintOut(vOpt, vOpt, vOpt, vOpt, vOpt, vOpt,
              vOpt, vOpt, vOpt, vOpt, vOpt, vOpt,
              vOpt, vOpt, vOpt, vOpt, vOpt, vOpt);

oDoc.Close(vOpt, vOpt, vOpt);

// Quit the application
oWordApp.Quit(vOpt, vOpt, vOpt);


А вообще просто поищи в MSDN статью "Automating Microsoft Office 97 and Microsoft Office 2000". Там все подробно описано.
Вопрос № 114 ( subj )

Здравствуйте, All !

Думаю, тут не мало программистов, пишущих программы в Visual C++ и использующих MFC.

Прошу Вашего совета.

Дело в том, что я пишу все проги в Visual C++ 6.0 но задумал перейти на
Visual Studio .NET у меня есть студия 2002 года выпуска. Но уже появилась
вроде студия 2005 beta2. Но суть не в этом.

При написании программ в Visual C++ 6.0 в настройках проекта я смело ставил
всегда использование Shared MFC DLL. При этом размер exe-шника получается
естесственно, весьма маленьким. Эти самые DLL-ки (mfc42.dll и другие) есть в
винде начиная с win98. Таким образом о работоспособности проги можно не
беспокоиться.
Но что делать при переходе на Visual Studio .NET ?
Там используются mfc70.dll, которых ни в Windows 98, ни в win2k ни, вроде,
даже в WinXP по умолчанию нет. Они ставятся вместе со студией.

Вариантов видится несколько:

1. Линковать прогу со статическими либами (надежно, но размер exe-шника
   будет гораздо больше.
2. Класть все необходимые DLL-ки в инсталлытор. Но тогда инсталл сильно
   вырастет. И выгоднее окажется пункт 1.
3. Как то извратиться и проверять при запуске необходимые DLL и если их
   нет, то посылать пользователя куда то их скачивать. Но такой вариант
   по моему вообще не годится. После такого запроса пользователь
   просто грохнет такую программу без суда и следствия.

Так как же быть ?
Очень интересно кто как делает в этом случае.

Ответ ( RTE )

Тож задавался в свое время таким вопросом, тож людей спрашивал, в рассылку
писал.
И вот что мне по этому поводу поведал товарищ StanGman:
------
     Способ 1)
Статическая компоновка с оптимизацией по размеру кода.
[++] Всё, естественно, работает как положено.
[--] Размер проги, всё же, не так мал как хотелось бы.
     Способ 2)
Настройка путей в Visual Studio к папкам VC6:
a) Распаковываешь куда-нибудь старый дистрибутив (у меня - MSVC++6 SE);
б) Настраиваешь в студии (в VS7 это здесь: Tools -> Options -> Projects ->
VC++
Directories) пути (должны быть первыми!) к
Libraries, Include files и Sources от VC6, например,
Include Files
(путь)VC98\INCLUDE
(путь)VC98\MFC\INCLUDE
Library Files
(путь)VC98\LIB
(путь)VC98\MFC\LIB
Source Files
(путь)VC98\CRT\SRC
(путь)VC98\MFC\SRC
в) Собираешь проект, получая кучу предупреждений и, возможно, несколько
ошибок, поскольку, во-первых, VC++7 куда более строго надзирает за
приведением типов, а, во-вторых, каркас твоего приложения был сгенерирован
на основе MFC 7.1.
[++] Когда всё заработает, depends.exe покажет, что приложение связано с
MFC42.dll и
MSVCRT.dll (а не MFC71.dll и MSVCR71.dll). Код
- невелик.
[--] Лишние заботы и пункт в).
     Способ 3)
Оставляешь всё как есть, указав в описании, что прога требует для работы
MFC71.dll: кому надо - скачает ;).
[++] Никаких усилий и плюсы способа 2.
[--] Нет (жалких лентяев :-C, которые не торопятся завести новую MFC, в
расчёт не берём :) ).
     Способ 4)
Возвращаешься к VC6 и ждёшь того счастливого дня, когда число тех, кому
надо - а у них нет (см. способ 3) - станет пренебрежимо мало :).
[++] См. [++] способа 3.
[--] Возможно, в тот момент, когда решаешься перейти к способу 3,
появляется очередная навороченная версия (какая-нибудь Virtual 3D-Studio
super dot Net), хочется перейти на неё, и проблема повторяется - рекурсия
:(.
     Способ 5) ... способ n)
Целый ворох мазохистских, IMHO, способов, которые почему-то первыми
приходят мне в голову :), как-то: собственноручная реализация в программе
недостающих в старой mfc функций; написание dll с переходниками к
MFC42.dll, при отсутствии у пользователя MFC7x.dll; кропотливое изучение
исходниов MFC и CRT, внесение изменений в них
(ненужное - на свалку!), сборка MFC и CRT (но под другими именами) заново,
распространяем их вместе с программой и т.д.
[++] Приобретается бесценный опыт, закаляется дух.
[--] Требуются героические усилия %-6, чтобы заставить прогу заработать и,
в дальнейшем, сопровождать её.
---------

Сам иногда пользую
     Способ 6:
Создаешь проект в VC6, пишешь код и отлаживаешь беты в VC7, релиз
собираешь в VC6. Минусы и плюсы тут все на поверхности

Есть еще не очень хороший способ, который у меня не работал, но некоторые
говорят, что иногда действует (в чем я очень сомневаюсь)-
пропатчить в шестнадцатеричном редакторе готовый релизный екзешник:
MFC71.dll -> MFC42.dll

А ваще, канечна, умные люди говорят, что, хорошая прога должна быть готова
ко всему и единственно правильный путь - статическая линковка.

Ответ ( DarkSide )

Hello q,

Ну  эта  проблема  относится к вечным. И принципиально нерешаема при
текущем   подходе  к  организации Windows. Есть альтернативы: dotNET
или  Java,  но  там проблема распространения самой .NET или Java. Не
хотят юзеры ставить левый софт или копировать либы.
Лично  я  за статичекую линковку - просто и надежно, а главное юзера
напрягать  не надо. А для уменьшения размера есть упаковщики. Вполне
нормально можно сократить размер программы.

Best regards, DarkSide.

Ответ ( NET_PROGA )

Нормальное решение - неиспользовать MFC в C# пока не смениться поколение XP новой версией винды с изначально установленной вм C#.

Ответ ( Challenger )

Приветствую, subj. Вообще говоря, философия применения .NET технологий
требует наличия в Windows так называемой библиотеки классов NET Framework.
На данный момент для Visual Studio .NET 2003 применяется NET Framework 1.1,
но также уже есть и NET Framework 2.0 (видимо, предназначенная для Visual
Studio .NET 2005, которая "релизится" через неделю, 7 ноября). Я пока
недооцениваю такой способ распространения ПО, так как чтобы сохранить
маленький размер исполнимого файла, линкуя его с разделяемыми компонентами
Windows, необходимо установить эту самую библиотеку на каждую машину, где
планируется использовать приложение. Поговаривают, что в Windows Vista будет
обязательная поддержка NET Framework, иначе и быть не может, так как сама
винда переписана на управляемом коде, который и реализуется возможностями
данного компонента. Взять её можно с сайта Microsoft. Однако весит она
порядка 23 Mb, если не ошибаюсь. Установочный файлик является архивом и
носит название dotnetfx.exe.
                  С уважением, Heartwork.

Ответ ( Neco )

Всё, что касается седьмой студии лежит во FrameWork'е. Если стоит
FrameWork, то и проги, содержащие лишь стандартные компоненты пойдут
без проблем. Сам фрэйм весит никак не меньше десяти мегов и таскать
его за собой не рентабельно - надо просто указывать "требует FrameWork
такой-то версии" и пусть юзера мучаются, ищут.
В следующей винде он будет вшит по умолчанию (но конечно достанут
всех с апргейдами), поэтоум там можно будет не беспокоиться...
Анонсы книг по C/C++
Визуальное проектирование приложений C#
Визуальное проектирование приложений C#

Автор: Фролов А. В., Фролов Г. В.

В книге рассмотрены приемы визуального проектирования автономных приложений на языке программирования С# с использованием инструментальных средств Microsoft Visual Studio .NET. Рассмотрены принципы функционирования приложений Windows, управляемых событиями, на платформе Microsoft .NET Framework. Приведена методика использования Microsoft Visual Studio .NET для создания и отладки проектов приложений Windows на языке С#.

Приведена информация, необходимая для быстрого создания деловых приложений со сложным пользовательским интерфейсом, интегрированных с базами данных. Описаны приемы проектирования диалоговых окон, элементов управления и других компонентов.

Имеется большое количество примеров исходных программ, снабженных необходимыми комментариями.

Страница книги на Озоне
Программирование для Windows на C/C++.
Программирование для Windows на C/C++.

Автор: Н. Н. Мартынов

Настоящее учебное пособие предназначено для максимально широкого круга лиц, стремящихся изучить языки программирования С и C++, а также научиться создавать приложения для современных версий операционной системы Windows. Написанное в неформальном стиле, оно доступно для изучения как студентами и преподавателями вузов, так и учащимися и преподавателями средних школ.

Изучение пособия не предполагает наличия у читателей глубоких знаний по математике, устройству компьютеров и информатике. Требуется лишь предварительный опыт работы на компьютере, знание операционной системы Windows на уровне опытного пользователя, а также начальные знания по программированию на одном из языков высокого уровня.

Тем не менее, чтобы изучить языки программирования и выйти на уровень начального профессионального программирования на C/C++ для операционной системы Windows, нужно обладать недюжинными способностями и желанием как следует потрудиться. Основная цель данного пособия - облегчить эту объективно трудную задачу.

Книга представляет собой первый том двухтомника под общим названием "Программирование для Windows на C/C++". Второй том продолжит материал данной книги и, в основном, будет посвящен более сложным и глубоким понятиям языка C++, а также технологиям программирования.

Страница книги на Озоне
Рассылки и дискуссионные листы компьютерной тематики
Рассылки
Программирование на JavaScript

Все аспекты программирования на JavaScript - нестандартные приемы, ОРИГИНАЛЬНЫЕ скрипты, авторские статьи и наработки. "JavaScript solutions" - в каждом выпуске готовый к применению ИНТЕРЕСНЫЙ скрипт (исходный код с комментариями).

Дискуссионные листы
Программирование. Форум !!!

Самый популярный дискуссионный лист по программированию на subscribe.ru, существующий с момента открытия сервиса дискуссионных листов !

Задайте здесь любой вопрос по программированию - и Вы получите ответ. Участвуйте в оживленных дискуссиях, обсуждайте интересные темы. Давайте ответы сами. Ведь это форум !!! Здесь просто интересно ! Присоединяйтесь !

Вебстроительство. Форум !!!

В дискуссионном листе ведется обсуждение различных аспектов создания сайтов - написание скриптов, использование, настройка портальных движков, и многое другое. Присоединяйтесь !

Поисковые системы. Форум !!!

Этот дискуссионный лист посвящен обсуждению поиковых систем, методов индексации сайтов поисковиками, способам оптимизации сайта под поисковые системы.

Хостинг. Обзоры и обсуждения платного и бесплатного хостинга.

Вы ищете хостинг (платный, бесплатный) ? Хотите спросить совета в выборе ? Можете обсудить это здесь. Поделитесь советом, если знаете. Или узнайте больше. Все о хостинге.


Всего доброго. До встречи в следующем номере.

Subscribe.Ru
Поддержка подписчиков
Другие рассылки этой тематики
Другие рассылки этого автора
Подписан адрес:
Код этой рассылки: comp.soft.prog.cppqa
Архив рассылки
Отписаться
Вспомнить пароль

В избранное