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

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

  Все выпуски  

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


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

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

Выпуск      : 30
Подписчиков : 2676
Cайт        : SoftMaker.com.ru
Архив       : C/C++ Вопрос-Ответ (архив)
В этом выпуске
Визуальное проектирование приложений C#.

Визуальное проектирование приложений C#.

От ведущего

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

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

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

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

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

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

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

Подписчикам

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

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

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

Вопросы

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

Вопрос № 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") и вызывать их методы?

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

Вопрос № 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 и если их
   нет, то посылать пользователя куда то их скачивать. Но такой вариант
   по моему вообще не годится. После такого запроса пользователь
   просто грохнет такую программу без суда и следствия.

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

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

Ответы

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

Вопрос № 110 ( Хан Николай )

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

Программирую на C++Builder, но вопрос будет немного офф...

Есть необходимость написать программу, отправляющую письма,
содержащие вложения (архив .rar) средствами MAPI. Прием писем будет
производиться программой TheBat! Программу написал, письма уходят,
НО!..

Наблюдается засада при отправке из Outlook 2К/ХР/2003 и приёмом батом
Приходит пустое письмо с вложением winmail.dat
Насколько я разобрался, это все из-за формата ms-tnef от Microsoft.
Бат его не понимает категорически. Перенестройки Аутлука
(создавать и отправлять все в текстовом формате) не дали никакого
результата (МАПИ от Аутлука создает все в формате ms-tnef или как
он отмечен в самом Аутлуке - RTF)

Тогда подредактировал win.ini
[Mail]
...
OLEMessaging=1 //попробовал поставить в 0

При этом приходит уже не пустое письмо - сабж и текст письма
читаются, но вместо вложения опять winmail.dat... При этом
заголовки отправленного письма те, которые нужны... Вместо ms-tnef
тип теперь octet-stream...

Подскажите где еще можно копать?..

Вот кусок кода, которым отправляется письмо:

....
#define CHECK(r)\
  if( r!=SUCCESS_SUCCESS )\
    throw Exception(AnsiString().sprintf("Письмо не было"
    " отправлено, код ошибки: %d.", r))
//----------------------------------------------------------
сlass TMailMessage
{
public:
  AnsiString ToAddress; // examle "smtp:adres@host.ru"
  AnsiString ToName; //display contact name
  AnsiString FromAddress;
  AnsiString FromName;

  AnsiString Subject; //mail message subject
  AnsiString Text; //mail message text

  std::vector<AnsiString> Attachments; //attachments files

  bool EditMessage;

  TMailMessage(HWND OwnerWnd) :Handle(OwnerWnd),
                               EditMessage(true) {};

  void __fastcall Send();

private:
  HWND Handle;

};
 ....
//----------------------------------------------------------
 ....
void __fastcall TMailMessage::Send()
{
  UINT hSession = 0;
  ULONG ret;

  MapiMessage msg;
  FillMemory(&msg, sizeof(MapiMessage), 0);

  msg.lpszSubject = Subject.c_str();
  msg.lpszNoteText = Text.c_str();

  MapiRecipDesc From;
  FillMemory(&From, sizeof(MapiRecipDesc), 0);
  From.ulRecipClass = MAPI_ORIG;
  if(!FromName.IsEmpty())
    From.lpszName = FromName.c_str();
  From.lpszAddress = FromAddress.c_str();
  msg.lpOriginator = &From;

  msg.nRecipCount = 1;
  MapiRecipDesc To;
  FillMemory(&To, sizeof(MapiRecipDesc), 0);
  To.ulRecipClass = MAPI_TO;
  if(!ToName.IsEmpty())
    To.lpszName = ToName.c_str();
  To.lpszAddress = ToAddress.c_str();
  msg.lpRecips = &To;

  msg.nFileCount = Attachments.size();
  if(msg.nFileCount > 0)
  {
    MapiFileDesc* files = new MapiFileDesc[msg.nFileCount];
    FillMemory(files, sizeof(MapiFileDesc)*msg.nFileCount,
                0);

    for(UINT i = 0; i < msg.nFileCount; i++)
    {
      files[i].nPosition = -1;
      files[i].lpszPathName = Attachments[i].c_str();
      files[i].lpFileType = NULL;
    }
    msg.lpFiles = files;
  }

  FLAGS flags(MAPI_LOGON_UI);
  if(EditMessage) flags|=MAPI_DIALOG;
  ret = MapiSendMail(hSession, 0, msg, flags, 0);
  CHECK(ret);

}

 ....

Ответ ( joe329 )

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

Есть такая замечательная утилита командной строки, называется postie.
Эта постовая программа, позволяющая принимать/отправлять почту по
POP3/SMTP. Ей надо прописать аргументы типа

postie.exe -host:mail.provider.ru -to:lena@mail.ru
 -from:vasya@yandex.ru -msg:read_attachment -a:myfile.txt -s:tema_pisma -rm

(Пояняю некоторое: отправляем через хост mail.provider.ru письмо на
ящик lena@mail.ru, указываем отправителя vasya@yandex.ru, в теле
письма будет написано "read_attachment", к письму будет приаттачен
файл "myfile.txt", темой письма будет указано "tema_pisma".

Всё это я вызываю из Сишной проги вот так:

spawnl(0, cmd, "postie.exe", "postie.exe", arg2, ..., argN, 0);



Получается дёшево и сердито.
Вопрос № 111 ( ferter )

Кто нибудь помогите мне нужно написать прогу которая из file1.dat копирует в file2.dat
пока не встретит слово >7 символов. Я вот написал она компилится но не работает
и еще как построчно читать фаил например чтоб удалить комментарии из него на MFC

void CaaDlg::OnBnClickedButton1()
{
CString buffer;
CString buffer1;
CString buffer2;
int j=0;
CStdioFile InFile1("c:\\temp\\file1.dat", CFile::modeRead);
CFile InFile2("c:\\temp\\file2.dat", CFile::modeWrite);
InFile1.ReadString( buffer);
LPSTR ps = buffer.GetBuffer(1024);
LPSTR ps1 = buffer1.GetBuffer(1024);
LPSTR ps2 = buffer2.GetBuffer(1024);
for(int i=0;i<1024;i++)
{
j++;
ps[i]==ps1[i]; //почему ps[i] не записывает в ps1[i] ?

buffer.ReleaseBuffer();
buffer1.ReleaseBuffer();
if(ps[i]==' ')
{buffer.ReleaseBuffer();

j=0;}
if(j==7)
{ps1==ps2; // почему?
buffer1.ReleaseBuffer();
buffer2.ReleaseBuffer();
}

}

InFile2.Write( buffer2,strlen(buffer2));
InFile1.Close();
InFile2.Close();

}

Ответ ( Oleg Lyamtsev )

Здравствуйте.

Оператор ps[i] == ps1[i]; не изменяет значения переменных, а только
сравнивает их. Для присваивания используйте оператор “=”.

Успехов!

Ответ ( 1 )

>>ps[i]==ps1[i]; //почему ps[i] не записывает в ps1[i] ?
Что это за фигня? Двойной знак равенства применяется обычно в условии. А если надо присвоить - ps1[i]=ps[i]. А вообще лучше используй мэппинг - намного быстрей будет и прога меньше получится.

Ответ ( Neco )

Честна говоря, я стараюсь не пользоваться классами (чтобы не
увеличивать экзешники), поэтому не полностью въехал даже на каком
языке это всё. Но даже не въезжая, я вспомнил, что двойной знак
равенства это не оператор присваивания, а сравнения. Возможно вся беда
от этого.
А вообще, советую переписать всё на более низком уровне (fopen,
fclose) и без всяких там CString'ов - чисто конкретно, char'ами.
Имхо, лучше въезжается...
Вопрос № 112 ( synops )

Приветствую всех читателей рассылки!

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

Отсюда возникло несколько вопросов:

1. Каким образом можно "размотать" стек, узнав адреса функций, которые вызывались до возникновения исключения ? И хотелось бы еще узнавать при этом все имена этих функций, если такое вообще возможно.
2. Возможно ли, и если да то как узнать номер строки программного кода, где произошло исключение ?
3. И как можно узнать есть ли в программе утечки памяти как это делает дебаггер.

Все это думаю делать на VC++.


Ответ ( Шматко А.А. )

    Разумеется, всё это возможно. Иначе как бы это делал сам дебаггер. И
стек разматывает, и имена функций с параметрами и их значениями показывает,
и об утечках памяти сообщает. Но он для этого использует отладочную
информацию, сформированную компилятором и сохранённую линкером. Если есть
желание с ней разобраться, то всячески поддерживаю, и желаю успехов, ибо
занятие очень не для слабохарактерных. Копать нужно в сторону PSAPI.h и
особенно DbgHelp.

Ответ ( Neco )

Я вообще-то не очень шарю в сишке (и на рассылку подписался, чтобы
ума поднабраться, но что-то сильно хочется высказаться), но могу
предположить, что обработка исключений ведётся сишными либами, которые
(насколько я знаю) в релизовой версии отсутствуют и поэтому ловить там
уже нечего.
По поводу утечек - насколько я знаю, это можно сделать
переназначением malloc'а и free (либо new и delete). Т.е. ручками
составляешь журнал выделяемой памяти и при завершении проги
распечатываешь. Если не пустой, значит где-то подтекает. Опять же это
делать надо только в DEBUG версии, а в релизе это дело само должно
отбрасываться за ненадобностью.
Анонсы книг по C/C++
Программирование на C++ глазами хакера (+ CD-ROM)
Программирование на C++ глазами хакера (+ CD-ROM)

Автор: Михаил Фленов

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

Компакт-диск содержит исходные коды примеров и откомпилированные программы, а также популярные приложения компании CyD Software Labs.

Страница книги на Озоне
C/C++. Структурное программирование. Практикум.
C/C++. Структурное программирование. Практикум.

Автор: Т. А. Павловская, Ю. А. Щупак

Практикум предназначен для изучения языка C++ на семинарах и для его самостоятельного освоения. Он является дополнением к учебнику Т.А.Павловской "C/C++. Программирование на языке высокого уровня", выпущенному издательством "Питер" в 2001 году.

В практикуме на примерах рассматриваются средства C++, используемые в рамках структурной парадигмы:
  • стандартные типы данных,
  • основные конструкции,
  • массивы,
  • строки,
  • структуры,
  • функции,
  • шаблоны,
  • динамические структуры данных.

Обсуждаются алгоритмы, приемы отладки, вопросы качества и стиля.
По каждой теме приведено несколько комплектов из 20 вариантов заданий.

Допущено Министерством образования Российской Федерации в качестве учебного пособия для студентов высших учебных заведений, обучающихся по направлению "Информатика и вычислительная техника".

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

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

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

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

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

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

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

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

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

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

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


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

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

В избранное