Текущий архив: 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.48 MB
Время: 0.008 c