Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

OLE Automation & Win32API [D6, D7, Win2k]


fishca ©   (2003-05-06 17:33:00) 

Помогите с информацией по написанию на Паскале в Win32 API серверов автоматизации реализованных не в DLL, а в EXE файле.
Как в DLL реализовать я знаю, а вот как сделать EXE файл?


Suntechnic   (2003-05-15 02:12:00) [1]

>Тих

Тебя послушать, так вообще не понятно как COM без Delphi существует :)

Я вот только одного не понял: каким образом стандартный маршалинг (надо полагать имеется ввиду универсальный маршалинг) связан с IDispatch, что без него никак не обойтись? Я вот, допустим, всю жизнь без IDispatch прожил и не жалею :)


hope   (2003-05-15 01:54:00) [2]

Библиотеку типов создавать только руками, Delphi в этом помочь не может? Главное правильно библиотеку типов написать и скомпилить ее при помощи midl.exe и все должно заработать?

Извините, может я не "въехала". но в Delphi есть меню: File->New->Other->page "ActiveX" -> "Type Library"


Тих   (2003-05-15 00:31:00) [3]

Соврал. Не тащат эти модули за собой VCL. Но без них таки как без рук.


Тих   (2003-05-15 00:27:00) [4]

> fishca ©
Как-то неприлично спрашивать "А зачем?" - но иначе ты умучаешься. IUnknown потянет за собой ComObj, ActiveX, они за собой - VCL, можно, кончено, и выковырять нужные функции по одной... если у тебя вся жизнь впереди; IUnknown ом ты не обойдешься, захочется стандартный маршалинг использовать - тащи ещё и IDispatch, а иначе придется Custom реализовывать - я про такие преценденты на Delphi не слыхал :-)
Короче. Лучше не надо :-) Проще ATL выучить, честное слово, чем пришивать кобыле хвостъ.


Suntechnic   (2003-05-14 16:24:00) [5]

>fishca ©
Библиотеку типов создавать только руками, Delphi в этом помочь не может?
IDL не настолько сложный язык, чтобы нужна была помощь Delphi в этом вопросе.

Главное правильно библиотеку типов написать и скомпилить ее при помощи midl.exe и все должно заработать?

Ну если правильно написать, то, наверное, должно заработать :)


fishca   (2003-05-14 16:16:00) [6]

Библиотеку типов создавать только руками, Delphi в этом помочь не может? Главное правильно библиотеку типов написать и скомпилить ее при помощи midl.exe и все должно заработать?


Suntechnic   (2003-05-14 15:56:00) [7]

>fishca © (14.05.03 15:46)
Я так понимаю надо создать библиотеку типов, интерфейс, который будет виден с наружи. Это все понятно, но как реализовать proxy и stub? Или их не надо реализовывать, а можно воспользоваться стандартными заместителями из Windows?

Перечитай ещё раз Suntechnic © (06.05.03 20:24), а именно второй абзац.

Касательно кода... А надо ли вообще твоему COM серверу главное окно программы? Обычно сразу же на входе делают анализ командной строки и запускают либо COM сервер либо приложение как таковое. В первом случае, как правило, нет необходимости в создании главного окна.


fishca   (2003-05-14 15:46:00) [8]

Я так понимаю надо создать библиотеку типов, интерфейс, который будет виден с наружи. Это все понятно, но как реализовать proxy и stub? Или их не надо реализовывать, а можно воспользоваться стандартными заместителями из Windows?

program ComServer;

uses windows, messages;

const idb_main = 10;

var wc : TWndClassEx;
MainWnd : HWND;
Mesg : TMsg;
btn : HWND;

function WindowProc(wnd:HWND; Msg : Integer; Wparam:Wparam; Lparam:Lparam):Lresult; stdcall;
var nCode, ctrlID : word;
Begin
case msg of
wm_command :
Begin
nCode:=hiWord(wParam);
ctrlID:=loWord(wParam);
case ctrlID of
idb_main : begin
MessageBox(0,"Привет!","Заголовок",MB_OK);
end;
end;
End;
wm_destroy :
Begin
postquitmessage(0); exit;
Result:=0;
End;

else Result:=DefWindowProc(wnd,msg,wparam,lparam);
end;

End;

var xPos,yPos,nWidth,nHeight : Integer;

begin
wc.cbSize:=sizeof(wc);
wc.style:=cs_hredraw or cs_vredraw;
wc.lpfnWndProc:=@WindowProc;
wc.cbClsExtra:=0;
wc.cbWndExtra:=0;
wc.hInstance:=HInstance;
wc.hIcon:=LoadIcon(0,idi_application);
wc.hCursor:=LoadCursor(0,idc_arrow);
wc.hbrBackground:=COLOR_BTNFACE+1;
wc.lpszMenuName:=nil;
wc.lpszClassName:="WndClass1";

RegisterClassEx(wc);

xPos:=100;
yPos:=150;
nWidth:=400;
nHeight:=250;


MainWnd:=CreateWindowEx(0,"WndClass1",
"Caption",
ws_overlappedwindow,
xPos,yPos,nWidth,nHeight,0,0,
Hinstance,nil);

btn:=CreateWindowEx(0,"button","name",bs_pushbutton or ws_child or ws_visible,
10,10,75,25,mainWnd,idb_main,hInstance,nil);

//
//Здесь через фабрику класса создавать экземпляр сервера и далее им управлять?


ShowWindow(MainWnd,CmdShow); // можно показывать или нет...

While GetMessage(Mesg,0,0,0) do
begin
TranslateMessage(Mesg);
DispatchMessage(Mesg);
end;

end.


Вообще же хотелось бы где - то ознакомится поподробней про маршаллинг


Suntechnic   (2003-05-07 15:38:00) [9]

>fishca ©
Я этим занимался... и что? Никто здесь не собирается за тебя приложение писать. Есть конкретные вопросы? Спрашивай. Советы дать? Пожалуйста. А код за тебя писать... извини.


fishca   (2003-05-07 12:52:00) [10]

Неужели этим никто не занимался!?


fishca   (2003-05-07 10:12:00) [11]


> В MSDN, вестимо. Там все "чиста на API"

Но там все на Си. В том то и дело. А мне на Паскале надо.


Игорь Шевченко   (2003-05-07 10:07:00) [12]

fishca © (07.05.03 10:04)

В MSDN, вестимо. Там все "чиста на API"


fishca   (2003-05-07 10:04:00) [13]

Есть программа написанная на чистом Win32 API. Ее необходимо сделать СОМ - сервером. Может кто знает где посмотреть примеры исходников подобного преобразования?


Suntechnic   (2003-05-06 20:24:00) [14]

В чём конкретно нужна помощь? Тема очень общирная, так что задавай конкретные вопросы. Пока могу лишь дать несколько советов...

Если твои интерфейсы работают с VARIANT совместимыми типами, то лучше всего использовать универсальный маршалинг(или маршалинг библитеки типов) чтобы избавиться от необходимости создания своих proxy и stub объектов. Для это твои интерфесы должны быть помечены IDL аттрибутом oleautomation. Регистрация интерфесов в этом случае осуществляется с помощью ф-ции LoadTypeLibEx.

Понятно, что в случае EXE сервера ни какой речи о ф-циях типа DllRegisterObject, DllGetClassObject быть не может. В этом случае регистрация COM сервера и его старт осуществляется с помощью анализа параметров командной строки, а регистрация фабрики классов с помощью CoRegisterClassObject. Когда SCM стартует приложение как COM сервер, то в командную строку передаётся параметр "Embedding".


Наверх

Титульная страница Поиск, карта сайта Написать письмо