Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2003.07.17;
Скачать: [xml.tar.bz2];

Вниз

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 вся ветка

Форум: "WinAPI";
Текущий архив: 2003.07.17;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.01 c
3-55448
Merlot
2003-06-24 17:11
2003.07.17
Временная таблица


3-55464
RH
2003-06-25 13:02
2003.07.17
Работа с dbf-ками


1-55610
bpv
2003-07-03 15:02
2003.07.17
MS Project и Дельфи


14-55832
APTEMKA
2003-06-30 23:55
2003.07.17
можно ли определить сходу, принадлежит к Фибоначи


1-55595
Sheng
2003-07-03 13:34
2003.07.17
Вызов почтовоко клиента





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский