суббота, 27 сентября 2008 г.

Автоматизация Word из С++

Когда я ещё работал не на себя было у меня такое задание автоматизировать работу Word под создание в нём шаблонов для различных документов. И я тогда с этим естественно столкнулся впервые и много рыл по инету. Много кода всякого нашлось, часть которого мне пригодилась, часть оказалась не нужной.

Вот кусок кода по автоматизации word из С++, который достаточно хорошо раскрывает, что к чему.


_Application oWord;
Documents oDocs;
_Document oDoc;
Selection oSelection;
Paragraphs oParagraphs;
Tables oTables;
Table oTable;
Range oRange;
Columns oColumns;
Column oColumn;
Rows oRows;
Row oRow;
Cells oCells;
Cell oCell;
Shading oShading;
Hyperlinks oHyperlinks;
MailMerge oMailMerge;
MailMergeFields oMailMergeFields;
COleVariant vtOptional((long)DISP_E_PARAMNOTFOUND,VT_ERROR),
vtTrue((short)TRUE),
vtFalse((short)FALSE);
CString StrToAdd;

// запускаем word
if (!oWord.CreateDispatch("Word.Application")) {
AfxMessageBox("Word failed to start!");
} else {
// делаем его видимым
oWord.SetVisible(TRUE);

// добавляем новый документ
oDocs = oWord.GetDocuments();
oDoc = oDocs.Add(vtOptional,vtOptional);
CreateMailMergeDataFile(&oWord,&oDoc);

//добавляем адресс
StrToAdd = "State University\r\nElectrical Engineering " \
"Department";
oSelection = oWord.GetSelection();
oParagraphs = oSelection.GetParagraphs();
oParagraphs.SetAlignment(1); // 1 = wdAlignParagraphCenter
oSelection.TypeText(StrToAdd);
InsertLines(&oSelection,4);
oParagraphs.SetAlignment(0); // 0 = wdAlignParagraphLeft
oMailMerge = oDoc.GetMailMerge();
oMailMergeFields = oMailMerge.GetFields();
oMailMergeFields.Add(oSelection.GetRange(),"FirstName");
oSelection.TypeText(" ");
oMailMergeFields.Add(oSelection.GetRange(),"LastName");
oSelection.TypeParagraph();
oMailMergeFields.Add(oSelection.GetRange(),"Address");
oSelection.TypeParagraph();
oMailMergeFields.Add(oSelection.GetRange(),"CityStateZip");
InsertLines(&oSelection,4);

// устанавливаем правое равнение абазца
oParagraphs = oSelection.GetParagraphs();
oParagraphs.SetAlignment(2); // 2 = wdAlignParagraphRight

// вставляем текущюю дату
oSelection.InsertDateTime(COleVariant("dddd, MMMM dd, yyyy"),\
vtFalse,vtOptional);
InsertLines(&oSelection,2);

//меняем выравнивание на Justify
oParagraphs = oSelection.GetParagraphs();
oParagraphs.SetAlignment(3); // 3 = wdAlignParagraphJustify
oSelection.TypeText("Dear ");
oMailMergeFields.Add(oSelection.GetRange(),"FirstName");
oSelection.TypeText(",");
InsertLines(&oSelection,2);

// добавлем сообщение
StrToAdd = "Thank you for your recent request for next " \
"semester's class schedule for the Electrical " \
"Engineering Department. Enclosed with this letter " \
"is a booklet containing all the classes offered " \
"next semester at State University. Several new " \
"classes will be offered in the Electrical " \
"Engineering Department next semester. These " \
"classes are listed below.";
oSelection.TypeText(StrToAdd);
InsertLines(&oSelection,2);

// добавляем новую таблицу с 9 рядами и 4 колонками
oRange = oSelection.GetRange();
oTables = oDoc.GetTables();
oTable = oTables.Add(oRange,9,4);

// задаём ширину каждой колонки
oColumns = oTable.GetColumns();
oColumn = oColumns.Item(1);
oColumn.SetWidth(51.0,0); // 0 = wdAdjustNone
oColumn = oColumns.Item(2);
oColumn.SetWidth(198.0,0); // 0 = wdAdjustNone
oColumn = oColumns.Item(3);
oColumn.SetWidth(100.0,0); // 0 = wdAdjustNone
oColumn = oColumns.Item(4);
oColumn.SetWidth(111.0,0); // 0 = wdAdjustNone

// задаём утенение для 1 ряда как wdGray25
oRows = oTable.GetRows();
oRow = oRows.Item(1);
oCells = oRow.GetCells();
oShading = oCells.GetShading();
oShading.SetBackgroundPatternColorIndex(16); // 16 = wdGray25

// вернуть жирный шрифт для первого ряда
oRange = oRow.GetRange();
oRange.SetBold(TRUE);

// задать выравнивание по сентру для ячейки 1,1
oCell = oTable.Cell(1,1);
oRange = oCell.GetRange();
oParagraphs = oRange.GetParagraphs();
oParagraphs.SetAlignment(1); // 1 = wdAlignParagraphCenter
// Fill in the class schedule data
FillRow(&oTable,1,"Class Number","Class Name",\
"Class Time","Instructor");
FillRow(&oTable,2, "EE220", "Introduction to Electronics II", \
"1:00-2:00 M,W,F", "Dr. Jensen");
FillRow(&oTable,3, "EE230", "Electromagnetic Field Theory I", \
"10:00-11:30 T,T", "Dr. Crump");
FillRow(&oTable,4, "EE300", "Feedback Control Systems", \
"9:00-10:00 M,W,F", "Dr. Murdy");
FillRow(&oTable,5, "EE325", "Advanced Digital Design", \
"9:00-10:30 T,T", "Dr. Alley");
FillRow(&oTable,6, "EE350", "Advanced Communication Systems", \
"9:00-10:30 T,T", "Dr. Taylor");
FillRow(&oTable,7, "EE400", "Advanced Microwave Theory", \
"1:00-2:30 T,T", "Dr. Lee");
FillRow(&oTable,8, "EE450", "Plasma Theory", \
"1:00-2:00 M,W,F", "Dr. Davis");
FillRow(&oTable,9, "EE500", "Principles of VLSI Design", \
"3:00-4:00 M,W,F", "Dr. Ellison");

// перейти в конец документа
oSelection.GoTo(COleVariant((short)3), // 3 = wdGoToLine
COleVariant((short)-1),vtOptional,vtOptional); // -1 = wdGoToLast
InsertLines(&oSelection,2);

// добавить текст
StrToAdd = "For additional information regarding the " \
"Department of Electrical Engineering, " \
"you can visit our website at ";
oSelection.TypeText(StrToAdd);

// добавить гипрессылку на домашнюю страничку
oHyperlinks = oSelection.GetHyperlinks();
oHyperlinks.Add(oSelection.GetRange(),
COleVariant("http://www.igvard.blogspot.com"
),vtoptional/);

// завершительная часть текста
StrToAdd = ". Thank you for your interest in the classes " \
"offered in the Department of Electrical " \
"Engineering. If you have any other questions, " \
"please feel free to give us a call at (999) " \
"555-1212.\r\n\r\n" \
"Sincerely,\r\n\r\n" \
"Kathryn M. Hinsch\r\n" \
"Department of Electrical Engineering\r\n";
oSelection.TypeText(StrToAdd);

// выполнить слияние писем
oMailMerge.SetDestination(0); // 0 = wdSendToNewDocument
oMailMerge.Execute(vtFalse);

// закрыть документ
oDoc.SetSaved(TRUE);
oDoc.Close(vtFalse,vtOptional,vtOptional);
}
}
/////////////////////////////////////////////////////////
void InsertLines(Selection *pSelection, int NumLines)
{
int iCount;

// вставить NumLines пустых линий
for (iCount = 1; iCount <= NumLines; iCount++) pSelection->TypeParagraph();

}
/////////////////////////////////////////////////////////
void FillRow(Table *pTable, int Row, CString Text1,
CString Text2, CString Text3, CString Text4)
{

Cell oCell;
Range oRange;

// вставить данные в заданную ячейку
oCell = pTable->Cell(Row,1);
oRange = oCell.GetRange();
oRange.InsertAfter(Text1);
oCell = pTable->Cell(Row,2);
oRange = oCell.GetRange();
oRange.InsertAfter(Text2);
oCell = pTable->Cell(Row,3);
oRange = oCell.GetRange();
oRange.InsertAfter(Text3);
oCell = pTable->Cell(Row,4);
oRange = oCell.GetRange();
oRange.InsertAfter(Text4);
}
/////////////////////////////////////////////////////////
void CreateMailMergeDataFile(_Application *pApp,_Document *pDoc)
{

_Document oDataDoc;
MailMerge oMailMerge;
Documents oDocs;
Tables oTables;
Table oTable;
Rows oRows;
int iCount;
COleVariant vtOptional((long)DISP_E_PARAMNOTFOUND,VT_ERROR),
vtFalse((short)FALSE);

// создать источник данных C:\DataDoc.doc содержащий данные
oMailMerge = pDoc->GetMailMerge();
oMailMerge.CreateDataSource(COleVariant("C:\\DataDoc.doc"),
vtOptional,vtOptional, \
COleVariant("FirstName, LastName, Address,CityStateZip"),\
vtOptional, vtOptional,vtOptional,vtOptional,vtOptional);

// открыть документ для вставки данных
oDocs = pApp->GetDocuments();
oDataDoc = oDocs.Open(COleVariant("C:\\DataDoc.doc"), \
vtOptional,vtOptional,vtOptional,vtOptional,\
vtOptional,vtOptional,vtOptional,vtOptional,\
vtOptional);
oTables = oDataDoc.GetTables();
oTable = oTables.Item(1);
oRows = oTable.GetRows();
for (iCount=1; iCount<=2; iCount++) oRows.Add(vtOptional);
// заполнить данными
FillRow(&oTable, 2, "Steve", "DeBroux", \
"4567 Main Street", "Buffalo, NY 98052");
FillRow(&oTable, 3, "Jan", "Miksovsky", \
"1234 5th Street", "Charlotte, NC 98765");
FillRow(&oTable, 4, "Brian", "Valentine", \
"12348 78th Street Apt. 214", "Lubbock, TX 25874");

// сохранить и закрыть файл
oDataDoc.Save();
oDataDoc.Close(vtFalse,vtOptional,vtOptional);
}

Cтатья откуда взят код на английском языке http://support.microsoft.com/kb/278260

пятница, 26 сентября 2008 г.

как получить элементы созданные JavaScript из DOM VC++

Сегодня столкнулся с такой вот проблемой - надо было получить элемент на web-страничке созданный javascript-ом из DOM VC++ кода.

Потратив уйму времени на поиски ответа в интернете, я уже было отчаялся, но
на самом деле всё оказолось намного проще, чем я ожидал :) В общем, что бы получить элемент в своё управление надо его получать через id, так как и сам скрипт обращается к созданым им элементам через их id.

Наглядный пример доступа к элемнету в javascript:


function Paste(text)
{
element = document.getElementById("message");
element.focus();
element.text = "какой то текст";
}


Тогда для vc++ будет:

// результат
IHTMLDocument2* pHtmlDoc2=NULL;

// интерфейс диспатча
LPDISPATCH lpDispatch=NULL;
if (!pBrowser)
lpDispatch=pHtmlCtrl->GetHtmlDocument();
else
{
HRESULT hr=pBrowser->get_Document(lpDispatch);

// Получим интерфейс докуменрта
HRESULT hr=lpDispatch->QueryInterface(IID_IHTMLDocument2, (void**)pHtmlDoc2);

// осовободим
lpDispatch->Release();
lpDispatch=NULL;

// получим список всех элементов документа
IHTMLElementCollection* pAllElements=NULL;
HRESULT hr=pHtmlDoc2->get_all( pAllElements );

pHtmlDoc2->Release();
pHtmlDoc2=NULL;

// получим количество элементов
long iCount;
pAllElements->get_length( &iCount );

// это тот самый элемент, который мы ищем
IHTMLElement* pElement=NULL;

// или вот этот диспатч
LPDISPATCH lpDispatch=NULL;
VARIANT bstrValue;
// пройдемся циклом по всем элементам
long i;
CString sID;
bool bFound =false;
for( i=0; iitem( i, i, &lpDispatch );
if (!lpDispatch)
continue;


// Получим интерфейс докуменрта
HRESULT hr=lpDispatch->QueryInterface(IID_IHTMLElement, (void**&pElement);

if (!pElement)
continue;

// получим id i-того элемента
CString strAt="id";
BSTR bstrAt = strAt.AllocSysString();
pElement->getAttribute(bstrAt,1,&bstrValue );

CString strNameVal ="";
if ( bstrValue.vt!=1 )
{
BSTR reVal = bstrValue.bstrVal;
sID=CString(reVal);
SysFreeString(bstrAt);
SysFreeString(reVal);
}

if(sID==sInputID) //sInputID - это id по которому мы и ищем элемент

// в нашем случае (message)
{
bFound =true;
break;
}

pElement->Release();
pElement =NULL;
}

// осовбодим интерфейсы если ничего не нашли
if (!bFound)
{
lpDispatch->Release();
lpDispatch=NULL;

pElement->Release();
pElement =NULL;

// в зависимости от того что вам надо на выходе

// вы можете использовать или lpDispatch элемента

// или же сам элемент как IHTMLElement интерфейс (pElement)

// но надо помнить что из lpDispatch мы можем получить конечный интерфейс

// элемента например IHTMLInputElement если это INPUT элемент
}

pAllElements->Release();
pAllElements=NULL;


// установим текст в элемент message
pElement->put_innerText(BSTR str);


Так же надо не забывать, что для получения элемента созданного javascript необходимо убедится, что скрипт уже отработал. ID-шники нужных элементов можно найти в исходном коде странице после выполнения скрипта.

вторник, 23 сентября 2008 г.

Всем кто надеется посвещается.

Надежда

Надежда словно червь
Терзает мою душу
Я жду от жизни всё
Надежда меня душит

Давно пора убить
Надежду и сомненье
Давно пора решить
Что делать в трудное мгновенье

Не надо ждать чего то с неба
Давай решай проблему сам
Надежда это лишь сомнение
Что травит душу нам

Она мешает делать дело
Спасать себя. ты ждёшь подмоги.
Она выигрывает время
Когда его осталось так немного.

Краткое описание программы Xedant Human Emulator.

Программа Xedant Human Emulator.

Кому может понадобится такая программа:


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


Что может делать программа:


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


Извлечение, сбор и исследование данных. Это загрузка котировок акций, сбора и сравнения цен на Веб-сайтах, получение ключевых слов и информации по ключевым словам и разного подобного рода информации.

Работа с веб-приложения(сайтами) использующие(-ми) AJAX.

Тестирование сайта - проверка валидности, функционаьлности и т.д.

Сохранять картинки с сайтов.

Менять устанвоки браузера - разрешать/запрещать прокси, всплывающие окна, диалоги отладки, сообщения браузера, рисунки, ActiveX, Java, все диалоги браузера и т.д.

Проверка обновлений сайтов.

Закачивать сайты на сервисы.

Создавать игровых ботов для большенства брузерных игр.


Безопасность - никакие ваши данные не передаются на наш или какой то другой сайт , а только на компьютер на котором установленна программа.


Плюсы.



Небольшая цена для подобных программ.

Возможность запуска множества окон программы одновреммено и, соответственно, множественное исполнение скритов одновременно.

Лицензия на программу даёт возможность устанавливать её на несколько компьютеров (в разумных приделах конечно).

Хорошая поддержка программы и помощь в написание не сложных скриптов.

Постоянно расширяющийся функционал.

Доступен весь функционал PHP языка.

Поддержка прокси.


Технические плюсы.


Расписание скриптов.
Автосоздание скриптов.
Удобный редактор PHP с раскраской синтаксиса, возможностью создания шаблонов, с диалогом вставки кода этих шаблонов, с диалогом вставки объектов XHE и их функций и т.д.


Язык Скриптов.

Язык скриптов PHP, так же есть возможность управления из VC++.



Возможности объектов программы:

Элементы HTML страницы.

Ссылка - объект xhe аnchor - элемент страницы A href - кликнуть на ссылку (по номеру, по имени, href, тексту), получить все ссылки на странице, получить текст всех ссылок на странице, установить фокус на ссылку(по имени, номеру), проверить есть ли ссылка, установить фокус на ссылку.

INPUT Кнопка - объект xhe button - элемент страницы INPUT ( input type=button, submit, reset) - нажать на кнопку по различным её атребутам, получить текст со всех кнопок на странице, проверить есть ли кнопка, установить фокус на кнопку.

Кнопка - объект xhe btn - элемент страницы BUTTON - нажать на кнопку по различным её атребутам, получить текст со всех кнопок на странице, проверить есть ли кнопка, установить фокус на кнопку.

Рисунок - объект xhe image - элемент страницы IMG - получить HREF, получить ALT, ширину, высоту, даты создание и изменения, размер файла рисунка, загружен ли, сохранение рисунка в файл, нажать на рисунок, установить фокус.

Фрайм - объект xhe frame - элемент страницы FRAME,IFRAME,FRAMESET - получить ширину, высоту, источник, список всех элементов фрайма.

Таблица - объект xhe table - элемент страницы TABLE - получить количество колонок, рядов, ширину и высоту.

Форма - объект xhe form - элемент страницы FORM - просабмитеть и обновить.

Поле ввода - объект xhe input - элемент страницы INPUT ( input type=text, password) - ввести/получить текст, получить alt, проверить есть ли такое поле, установить фокус.

Поле ввода имени файла - объект xhe input - элемент страницы INPUT ( input type=file) - ввести/получить текст, установить фокус.

Поле ввода большого текста - объект xhe textarea - элемент страницы TEXTAREA - ввести/получить текст, получить/установить состояние поля, получить количество колонок и рядов, установить фокус.

Чекбокс - объект xhe checkbox - элемент страницы INPUT ( input type=checkbox) - установить/получить состояние, установить фокус.

Радиобокс - объект xhe radiobox - элемент страницы INPUT ( input type=radiobox) - установить/получить состояние, установить фокус.

Поля выбора - объект xhe listbox - элемент страницы SELECT - выбор значения, выбор нескольких значений (если поддерживает элемент), получить индекс выбранного значения, количество значений, тип элемента выбора, установить фокус, выбрать значение по куску текста значения.

Скрипт - объект xhe script - элемент страницы SCRIPT -получить/установить defer скрипта, получить/установить событие запуска скрипта, получить состояние скрипта, получить/установить текст скрипта, получить/установить источник скрипта, получить/установить тип скрипта, получить/установить htmlfor скрипта.

Объекты не связанные с HTML страницами.

Мышь - объект xhe mouse - сэмулировать щелчок левой/правой кнопки мыши, сэмулировать нажатие на левую/правую кнопку мыши , сэмулировать отпускание левой/правой кнопки мыши, двойной щелчок, передвинуть курсор мыши, получить координаты курсора мыши.

Клавиатура - объект xhe keyboard - эммулирует нажатие всех символов заданой строки, эммулирует нажиматие одной кнопки, эмулирует нажатие специальных клавиш, таких как CTRL,ALT и т.д.

Сигнал - объект xhe sound - подать звуковой сигнал, проиграть wav - файл.

Буффер обмена - объект xhe clipboard - задать/получить текст в/из буффер обмена

Текстовый файл - объект xhe textfile - отсортировать заданный файл, получить количество строк, убрать одинаковый строки, собрать все файлы из папки в дин файл, уровнять файлы, объединить файлы, собрать все файлы из одной папки в другую.

Браузер - объект xhe browser - перейти на заданную страницу, обновить, остановить, назад браузер, проверяет - занят ли щас браузер навигацией, ожидать пока браузер освободится, удалять кэш, удалять историю, удалить историю из комбо адреса, очистить куки, разрешить прокси на заданное соединение, запретить прокси на заданном соединении, задать,сбросить логин и пароль для http соединений по умолчанию, установить ширину браузера, установить высоту браузера, задать User-Agent строку, задать параметр Accept, задать параметр Accept-Encoding, задать параметр Accept-Language, задать параметр Accept-Charset,получить версию браузера, получить выбранный текст из браузера, управлять настройками браузера (рисунки, актив X, Java и т.д. )

Web - Страница - объект xhe webpage - получить текущий урл браузера, получить исходный текст текущей веб страницы, получить длинну исходного текста текущей веб страницы, получить текст в тэге body, получить заголовок страницы, сохранить исходный текст страницы в файл, сохранить содержимое заданного урла в файл (любое cодержимое - и картинки), сделать копию экрана страницы в файл, получить html заданного элемента на странице.

СЕО - объект xhe seo - получить ранк страницы, получить тиц для сайта.

Приложение - объект xhe app - задать текст окна приложения, задать статус мигания приложения, выход (коррекное завершение скрипта), пауза (приостановить обработку скрипта), показать диалог ввода каптчи из картинки по заданному улру, диалог ввода каптчи из картинки c заданным номером, выполнить bat команду, выполнить php текст, выполнить заданнное приложение, получить файл с диска, вызывать диалог для ввода строки.

Отладка - объект xhe debug - диалоговое сообщение, открыть закладку с заданным именем, закрыть отладочную панель, добавить на закладку текст, сохранить содержимое отладочной панели в файл, очистить содержимое отладочной панели.

Виндоуз - объект xhe windows - получить ширину экрана, получить высоту экрана, задать разрешение экрана.


Примеры скриптов.
Примеры скриптов и более подробное описание можно найти на сайте поддержки программы.

четверг, 18 сентября 2008 г.

Лига Чемпионов

Поздравляю всех любителей украинского футбола Шахтёр выиграл свой матч на выезде против Базеля, а Динамо, как по мне (особенно после прошлой лиги чемпионов) очень хорошо сыграло в ничью против грозного Арсенала (который кстати ещё не разу не выигрывал на Украине :) ).

Будем болеть за наши клубы и в дальнейшем!!! Поеду в Донецк на Шахтёр - Барселона. Надеюсь только на победу. Шахтёр в состоянии выиграть у Барсы!!!! ОЛЕ-ОЛЕ-ОЛЕ-ОЛЕ!!!

среда, 17 сентября 2008 г.

Регистрация по каталогам

Текущее, чем щас занимаюсь, это пишу скрипты для регистрации по каталогам. То есть в Xedant Human Emulator создаю кучу скриптов, которые регистрируют сайт по каталогам. Пока что уже сделано для 20 каталогов - планирую сделать для 500-1000 каталогов. Скрипт будет доступен вместне с программой (без неё он сам по себе ни какой ценности не представляет).

Пример скрипта регистрации в каталоге:



// переходим на страницу
$browser->navigate("http://www.lar.placeforyou.ru");
$browser->wait(1);

// задаём данные
$input->set_value_by_name("url",$site_url);
$input->set_value_by_name("title",$site_title);

//$listbox->select_name_by_inner_name("cat_id","2050");
$listbox->select_part_value_by_name("cat_id",$category,"false");

$textarea->set_value_by_name("description",$site_description);
$input->set_value_by_name("email",$email);
$input->set_value_by_name("fio",$name);
// отправить
$button->click_by_number(0);
$browser->wait(1);

Получение из RTF простого текста

Это функция, которая получает из RTF строки обычный текст. Для этого я использую контрол CRichEditControl50W унаследованный от CRichEditCtrl (этот класс я отрыл в инете). Как это работает имеем на входе sContent - строка RTF и rchEdit - указатель на контрол. Запихиваем строку в контрол и получаем с него текст. В моём случае мне надо було получать текст из другого контрола и там находить. Поэтому пришлось добавлять в диалог скрытый rchEdit контрол и с ним уже работать.

Без участия контрола я так и не смог найти в инете решение. Были функциии, которые заменяли RTF текст на Text посредством замены RTF символов, но эти функции настолько не предсказуемо работали, что я просто отказался от их использования.


CString GetTextFromRTF(CRichEditControl50W *rchEdit,CString sContent)
{
long res;
// read the text in
EDITSTREAM es;
es.dwError = 0;
es.dwCookie = (DWORD) &sContent;
es.pfnCallback = CBStreamIn;

rchEdit->ModifyStyle(0,SEL_TEXT SEL_MULTICHAR SEL_MULTIOBJECT);

rchEdit->LimitText50W(-1);
// do it.
rchEdit->SetTextTo50WControl(sContent,ST_SELECTION, 1200);

rchEdit->SetSel50W(0, -1);

CHARRANGE cr;
cr.cpMin = 0;
cr.cpMax = -1;
// select all text in richedit ctrl
SendMessage(rchEdit->m_hWnd, EM_EXSETSEL, 0, (LPARAM)&cr);

// get number of chars in selected text
SendMessage(rchEdit->m_hWnd, EM_EXGETSEL, 0, (LPARAM)&cr);

int numchars = (cr.cpMax-cr.cpMin+2)*2; //allow for trailing null too

//create a buffer for all those chars
wchar_t* lpsz = (wchar_t*)_alloca(numchars);
lpsz[0] = NULL;


SendMessage(rchEdit->m_hWnd, EM_GETSELTEXT, 0, (LPARAM)lpsz);
CString sRes = CString(lpsz);

return sRes;
}

Мои проекты

Проектов у меня было много... Раскажу про те, которые щас для меня актуальны.

Последний проект, в котором я принимаю активное участие - Xedant Human Emulator(XHE). Это платная программа, которая позволяет автоматизировать вашу работу в инете. Пишешь скрипт на PHP и можно автоматом регаться на сайтах, в каталогах, парсить какие то данные из инета и многое многое другое. В принципе можно даже автомтизировать добавление постов в ваш блог - просто пишешь скрипт, который скажем добавляет ваш пост из .txt файла и вам не надо логинется заходить вставлять - всё это сделает за вас XHE.
Вообщем http://humanemulator.info - тут всё более подробнее...

Что касается кода, то в этом проекте я с толкнулся с такой новой для ся фигнёй, как DOM, с чем в предыдущих проектах не сталкивался... Меня впечатлила работа тех людей кто это писал... Понятно, что это не сразу, и не одним человеком, но всё таки кода написано там, конечно, просто дохренищаа!!!

Следующий проект, который тоже актуален - это программа оргонайзер Seo Note. Прога бесплатна и все желающие могут скачать её отсюда http://www.seonote.info. Программа пишется уже много лет, в фоне с другими проектами и не одним только мною. За эти многие года, она обрасла таким количеством кода, что просто писец, самому приходится снова вникать, когда долго не занимаешься этим проектом, а потом вдруг надо чегось сделать :).

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

Так же учавствую в проектах-сайтах www.carnote.info, www.buildernote.info и другие, которые не буду перечислять.
Конечно, заработок от сайтов мал, так как щас он поступает только от системы Adsense, а трафик на них слабенький... хотя при том времени, что сейчас им уделяется это не удивительно :)

Так же есть огромная куча идей новых проектов, но совсем нет на них времени :)

Нахрена

Создал блог и тут же задался мыслью, а нахера мне это надо... Та и воще нафига люди заводят болги... Наверное, что бы нести чушь на весь мир :), а может просто в надежде на то что ты ещё кому то станешь интересен, а может... та собственно говоря хрен с ним. Просто напишу немного о себе.

И начнёмс с самого начала...

Как и многие из нас был я рождён в великом могучем СССР. В великой и уже не существующей державе, в которой было много говна, но так же много и хорошего. Родился я на самых задворках великой империи на Камчатке в одном из военных городков, так как батя мой был в то время подводником. Жил я то на Камчатке с родоками, то в Севастополе у бабушки. Октябрёнок, потом пионер, потом развал. И я оказался в Украинском городе Российских моряков - в городе-герое Севастополе - уже с концами, так как батя, как раз перед развалом попал под сокращение.
Школа, о которой и вспоминать не хочется совсем, потом 5 курсов универа, который так и не домучал. Работал в море по специальности - судовым механиком пару лет, но меня совсем не впечатлила морская романтика (чему поспособствовали график работы и морская болезнь :)) и я ушёл и с парохода и из универа (просто стало не интересно учится :)).

Потом пошёл на Мангуп-Кале(есть тут у нас такая волшебная гора и, хочу сказать, что уже далеко не в первый раз я туда пошёл) и познакомился там с одним человечком, который раскрыл для меня мир программирования :) в двух словах так сказать. И я понял это моё...
Начал с Java, но на тот момент работы по нему не було и я засел за узучение С++, потом VB (можно сказать что с ним и С#), а потом и многое другое...

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

Ну, вот так вот потихоньку год за годом я и стал тем самым программистом, заметки которого вы ща и читаете:)

Начало ...

Вот и я теперь присоеденился к многомиллионной армии блогеров :) Очень долго упорно сопротивлялся, но ... увы позиции сданы и вот на ещё один блог стало в инете больше :)