Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.07.17;
Скачать: CL | DM;

Вниз

OLE Automation & Win32API   Найти похожие ветки 

 
fishca ©   (2003-05-06 17:33) [0]

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


 
Suntechnic ©   (2003-05-06 20:24) [1]

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

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

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


 
fishca ©   (2003-05-07 10:04) [2]

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


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

fishca © (07.05.03 10:04)

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


 
fishca ©   (2003-05-07 10:12) [4]


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

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


 
fishca ©   (2003-05-07 12:52) [5]

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


 
Suntechnic ©   (2003-05-07 15:38) [6]

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


 
fishca ©   (2003-05-14 15:46) [7]

Я так понимаю надо создать библиотеку типов, интерфейс, который будет виден с наружи. Это все понятно, но как реализовать 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-14 15:56) [8]

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

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

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


 
fishca ©   (2003-05-14 16:16) [9]

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


 
Suntechnic ©   (2003-05-14 16:24) [10]

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

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

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


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

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


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

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


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

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

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


 
Suntechnic ©   (2003-05-15 02:12) [14]

>Тих

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

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



Страницы: 1 вся ветка

Текущий архив: 2003.07.17;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.012 c
3-55385
oic
2003-06-22 20:28
2003.07.17
Как вставить картинку в БД


1-55556
MSAlex
2003-07-06 00:06
2003.07.17
TTreeView. Как графически выделить елемент под мышкой.?


1-55570
Andrey02
2003-07-02 01:37
2003.07.17
Измениить большое количество Excel.Application на WorkBook


3-55412
Evgenij Kardash
2003-06-22 19:18
2003.07.17
Запрос по двум таблицам


3-55474
MCFire
2003-06-25 16:24
2003.07.17
Как использовать StatusBar во время SQL запроса?