OLE автоматизация создание SDI MFC приложения

Дата: 23 July, 2015, Автор: admin_kselax

Здорова!

Сегодня разберем как создавать SDI MFC приложение в OLE Automation. Создавать будем в Visual Studio 2010, использоваться приложение будет в excel.

1 Создание каркаса приложения

Запускаем Visual Studio 2010, выбираем “Файл” -> “Создать” -> “Проект” в окошке выбираем “Приложение MFC” и вводим название проекта “MyOleClock”

mfc create app

>>>Читать далее

Создание OLE приложения dll с использованием диалогового окна MFC

Дата: 22 July, 2015, Автор: admin_kselax

Здорова!

Сегодня разберем как создать с помощью технологии OLE автоматизация приложение dll которое будет подгружаться в excel и запускать диалоговое окно простейшее. Мы пошагово рассмотрим как это делать.

1 Создание проекта

Создавать мы будем в Visual Studio 2010, запускаем ее и выбираем “создать проект”, выбираем “Библиотека DLL MFC”, назовем его “MyOleDlg”

mfc ole add

>>>Читать далее

OLE Автоматизация. Создание OLE програмы для использование в excel

Дата: 21 July, 2015, Автор: admin_kselax

Здорова!

Сегодня разберем пример OLE в котором мы создадим COM объект с применением технологии OLE автоматизации. Пример будет банковская программа. Будем создавать в Visual Studio 10, запускаем ее и создаем самое простое приложение на MFC на основе диалоговых окон. Приложение назовем “OLE_EXE”.

mfc dlg

>>>Читать далее

Microsoft Excel 2010 – создание макроса на VBA

Дата: 18 July, 2015, Автор: admin_kselax

Здорова ребятки!

Сегодня разберем как создаются макросы в Excel 2010 с использованием скриптового языка VBA (visual basic for application).

И так запускаем Excel 2010. создаем новую книгу. Затем заходим на вкладку Разработчик. Если ее у вас нету то вы ее можете включить, для этого выбираете “файл” -> “параметры”, потом выбираете “настройка ленты” и в панели “Основные вкладки” ставьте галочку на “Разработчик” и нажмите ОК. У вас появится вкладка разработчик.

Дальше чтобы создать макрос вначале нужно зайти в “Безопасность макросов”

exel macros

 

>>>Читать далее

MFC – COM технология

Дата: 16 July, 2015, Автор: admin_kselax

Здорова!

Сегодня разберем что такое com технология

  1. https://msdn.microsoft.com/ru-ru/library/k851ext3.aspx
  2. https://msdn.microsoft.com/ru-ru/library/bwa2bx93.aspx
  3. https://msdn.microsoft.com/ru-ru/library/ms694363.aspx

То что мы прочитали по ссылкам оно мне ничего не дает, я в книге прочитал про COM и там просто моделируется эта технология.

И так в общем на примере из книги разберем.

Моделирование COM технологии на примере космического корабля

>>>Читать далее

Создание COM объекта в MFC (MFC COM DLL) в Visual Studio 2010

Дата: , Автор: admin_kselax

Здорова ребятки!

Сегодня мы разберем как создавать COM объекты в MFC, COM объектов существует два вида внутренний dll и внешний exe. Внешний я не знаю как создавать, а от как MFC COM DLL в MFC создавать я разобрался.

И так приступим, открываем Visual Studio 2010, выбираем Файл -> создать проект, в появившемся окне “создать проект” выбираем “Библиотека DLL MFC” вводим имя “My_COM_DLL” >>>Читать далее

Заглушка предупреждений в Visual Studio __pragma(warning( ))

Дата: 12 July, 2015, Автор: admin_kselax

mfc worning

Здорова ребятки!

Сегодня разберем что такое

__pragma(warning( disable : 4867 ))

это запись которая добавляется в код и она глушит вывод ошибки C4867. __pragma – это не функция а директива препроцессора, __pragma – это ключевое слово специфическое для майкрософтовского компилятора. Введено для того чтобы можно было подставлять директивы препроцессора с помощью макросов.  Почитать за это можно тут.

worning – это директива которая включает выборочное изменение расширения функциональности предупреждающих сообщений компилятора. Почитать за нее можно тут.

Реальный пример заглушки warning

Показать »

#include <iostream>
using std::cout;

__pragma(warning( disable : 4172 ))
__pragma(warning( disable : 4101 ))

int& f()
{
	int x;//C4101
	int y(10);
	return y;//C4172
}

int main()
{
	cout <<f()<<"n";

	return 0;
}

#pragma это почти тоже что и __pragme, только это как бы ключевое словов, а #pragma – это сам макрос, приведем идентичные строки с кодом

Показать »

#pragma warning( disable : 4172 )
#pragma warning( disable : 4101 )

//идентичны строкам
__pragma(warning( disable : 4172 ))
__pragma(warning( disable : 4101 ))

Макросы в MFC

Дата: 11 July, 2015, Автор: admin_kselax

Здорова ребятки!

В Этом посте я буду разбирать макросы MFC, там очень много разных макросов, которые не понятные зачем они используются и так далее. Пока что я разобрал два макроса IMPLEMENT_DYNCREATE и DECLARE_DYNCREATE начнем с них.

IMPLEMENT_DYNCREATE и DECLARE_DYNCREATE

Показать »

Эти макросы используются для динамического создания объектов и так начнем с определения макроса IMPLEMENT_DYNCREATE

#define IMPLEMENT_DYNCREATE(class_name, base_class_name) 
	CObject* PASCAL class_name::CreateObject() 
		{ return new class_name; } 
	IMPLEMENT_RUNTIMECLASS(class_name, base_class_name, 0xFFFF, 
		class_name::CreateObject, NULL)

как мы видим создается функция CreateObject(), посмотрим определение макроса PASCAL:

#define PASCAL      __stdcall

Это просто знак для компилятора “Соглашение вызова”. Дальше посмотрим определение макроса IMPLEMENT_RUNTIMECLASS:

#define IMPLEMENT_RUNTIMECLASS(class_name, base_class_name, wSchema, pfnNew, class_init) 
	AFX_COMDAT const CRuntimeClass class_name::class##class_name = { 
		#class_name, sizeof(class class_name), wSchema, pfnNew, 
			RUNTIME_CLASS(base_class_name), NULL, class_init }; 
	CRuntimeClass* class_name::GetRuntimeClass() const 
		{ return RUNTIME_CLASS(class_name); }

как мы видим здесь создается определение функция GetRuntimeClass и создается инициализируется структура CRuntimeClass. В нашем классе должен быть член класса с названием class_name::class##class_name. Посмотрим определение макроса AFX_COMBAT:

#define AFX_COMDAT __declspec(selectany)

Это какаето фигня, вот ссылка, можете почитать что там пишут по этому поводу. Смотрим определение макроса RUNTIME_CLASS:

#define RUNTIME_CLASS(class_name) _RUNTIME_CLASS(class_name)

ну и смотрим макросс _RUNTIME_CLASS:

#define _RUNTIME_CLASS(class_name) ((CRuntimeClass*)(&class_name::class##class_name))

тут возвращается указатель на class_name::class##class_name, он должен находится в нашем классе.

Теперь давайте напишем какой реальный код создается при вызове макроса IMPLEMENT_DYNCREATE

IMPLEMENT_DYNCREATE(CSpaceship,CCmdTarget);

CSpaceship – это класс порожденный от ССmdTarget, CCmdTarget- это базовый класс класса CSpaceship. И в итоге этот макрос создаст следующий код:

	CObject* PASCAL CSpaceship::CreateObject() 
		{ return new CSpaceship; } 
	IMPLEMENT_RUNTIMECLASS(CSpaceship, CCmdTarget, 0xFFFF, 
		CSpaceship::CreateObject, NULL)

как видим появилось определение первой функция  CSpaceship::CreateObject, дальше вызывается макрос IMPLEMENT_RUNTIMECLASS, запишем что в результате этого вызова мы получим:

	AFX_COMDAT const CRuntimeClass CSpaceship::classCSpaceship = { 
		#CSpaceship, sizeof(class CSpaceship), 0xFFFF, CSpaceship::CreateObject, 
			RUNTIME_CLASS(CCmdTarget), NULL, NULL }; 
	CRuntimeClass* CSpaceship::GetRuntimeClass() const 
		{ return RUNTIME_CLASS(CSpaceship); }

здесь мы видим что идет инициализация структуры CRuntimeClass CSpaceship::classCspaceship – это статический член получается класса CSpaceship. и создается определение функции CSpaceship::GetRuntimeClass. И давайте теперь последний штрих заменим макрос RUNTIME_CLASS:

CObject* PASCAL CSpaceship::CreateObject() 
		{ return new CSpaceship; } 

AFX_COMDAT const CRuntimeClass CSpaceship::classCSpaceship = { 
 #CSpaceship, sizeof(class CSpaceship), 0xFFFF, CSpaceship::CreateObject, 
 ((CRuntimeClass*)(&CCmdTarget::class##CCmdTarget)), NULL, NULL }; 

 CRuntimeClass* CSpaceship::GetRuntimeClass() const 
 { return ((CRuntimeClass*)(&CSpaceship::classCSpaceship)); }

вот в общем то что мы получили в результате вызова

IMPLEMENT_DYNCREATE(CSpaceship,CCmdTarget);

два определения функции и инициализацию переменной.

 

Дальше разберем макрос DECLARE_DYNCREATE, вот его определение:

#define DECLARE_DYNCREATE(class_name) 
	DECLARE_DYNAMIC(class_name) 
	static CObject* PASCAL CreateObject();

создалось объявление функции CreateObject  и вызвался макрос DECLARE_DYNAMIC, вот его определение:

#define DECLARE_DYNAMIC(class_name) 
public: 
	static const CRuntimeClass class##class_name; 
	virtual CRuntimeClass* GetRuntimeClass() const; 

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

DECLARE_DYNCREATE(CSpaceship);

вот код:

	DECLARE_DYNAMIC(CSpaceship) 
	static CObject* PASCAL CreateObject();

и еще раз для макроса DECLARE_DYNAMIC:

public: 
	static const CRuntimeClass classCSpaceship; 
	virtual CRuntimeClass* GetRuntimeClass() const; 
static CObject* PASCAL CreateObject();

отакой код получается создает в классе

DECLARE_DYNCREATE(CSpaceship);

и от такой код

CObject* PASCAL CSpaceship::CreateObject() 
		{ return new CSpaceship; } 

AFX_COMDAT const CRuntimeClass CSpaceship::classCSpaceship = { 
 #CSpaceship, sizeof(class CSpaceship), 0xFFFF, CSpaceship::CreateObject, 
 ((CRuntimeClass*)(&CCmdTarget::class##CCmdTarget)), NULL, NULL }; 

 CRuntimeClass* CSpaceship::GetRuntimeClass() const 
 { return ((CRuntimeClass*)(&CSpaceship::classCSpaceship)); }

создается при вызове

IMPLEMENT_DYNCREATE(CSpaceship,CCmdTarget);

Приведем несколько реальных примеров использования этих двух макросов IMPLEMENTE_DYNCRATE и DECLARE_DYNCRATE

#include <iostream>
using std::cout;
#include <afxwin.h>

class CMy_class : public CObject
{
public:
	//есили конструктора нету, то он вроде создается пустой сам по себе
//	CMy_class(){}
	void print(){cout <<"class CMy_classrn";}
	
	//создает две функции:
	//static CObject* PASCAL CreateObject();
	//virtual CSpaceship* GetRuntimeClass() const; 
	//и переменную static const CRuntimeClass classCSpaceship;
	DECLARE_DYNCREATE(CMy_class)
};

//создает определение функций выше
/*CObject* PASCAL CMy_class::CreateObject() 
        { return new CMy_class; } 
 
AFX_COMDAT const CRuntimeClass CMy_class::classCMy_class = { 
 "CMy_class", sizeof(class CMy_class), 0xFFFF, CMy_class::CreateObject, 
 ((CRuntimeClass*)(&CObject::classCMy_class)), NULL, NULL }; 
 
 CRuntimeClass* CMy_class::GetRuntimeClass() const
 { return ((CRuntimeClass*)(&CMy_class::classCMy_class)); }
 */
IMPLEMENT_DYNCREATE(CMy_class,CObject)

int main()
{
	//создаем динамически объект
	CMy_class* ptr=(CMy_class*)CMy_class::CreateObject();
	ptr->print();
	
	//получаем доступ к структуре CRuntimeClass
	CRuntimeClass* pRun=ptr->GetRuntimeClass();
	//m_lpszClassName-имя класса в виде строки заканчивающееся нулем
	//m_nObjectSize-размер объекта в байтах
	//m_wSchema-номер версии
	cout <<pRun->m_lpszClassName<<" - "<<pRun->m_nObjectSize<<" - "<<pRun->m_wSchema<<"rn";

	return 0;
}

Вывод:

mfc macros

TRACE

Показать »

И так разберем этот макрос, сразу не сильно понятно что он делает, почитать можно здесь. Так этот макрос работает только при отладке, если мы просто компилируем программу то он компилируется в ничего. Разберем простой примерчик кода:

#include <iostream>
using std::cout;
#include <afxwin.h>

void f(double a, int b)
{
	TRACE("'%d' - Переменная %frn",b,a);
}

int main()
{
	TRACE("Hellow world!rn");
	f(0.35, 333);
	

	return 0;
}

И вывод:

mfc outputВывод идет во вкладку вывод когда мы нажимаем F5 – отладка.

Там еще существует несколько макросов TRACE0,TRACE1,TRACE2 и TRACE3 цифры означают количество параметров. Хз. зачем их использовать, мы будем использовать просто TRACE.

>>>Читать далее

Создание расширения для Firefox

Дата: 22 June, 2015, Автор: admin_kselax

add-on sdkЗдорова!

Решил написать плагин для Firefox. Там для этого существует несколько типо инструментов, вроде как щас популярно использовать Add on SDK вот ссылка на то где расписано как его скачать, установить и настроить. https://developer.mozilla.org/ru/Add-ons

>>>Читать далее

Drupal 7 – подключение файлов JavaScript

Дата: 17 May, 2015, Автор: admin_kselax

Здорова! Разберем как подключить JavaScript файлы к Drupal 7. К этой ЦМС если не так просто их подключить.drupal-7 Для этого нужно зайти в папку где находится тема вашего сайта и найти файл info и туда впасать файл js который вы хотите подключить.

 

В моем случае это файл

\sites\all\themes\starfish_responsive_theme\starfish_responsive_theme.info >>>Читать далее