Модераторы: MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> IDispatch, две программы, непонятно почему разные 
:(
    Опции темы
victor79
Дата 11.8.2009, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


программист
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 15.5.2008

Репутация: нет
Всего: нет



Есть две программы, каждая реализует один и тот же активх объект, который создается из 1С.
одна на дельфи:
Код

uses SysUtils, Windows, ActiveX;

type

tclass = class(TObject,IUnknown,IClassFactory,IDispatch)
private
    cntref: integer;
public
    constructor Create;
    function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
    function _AddRef: Integer; stdcall;
    function _Release: Integer; stdcall;

    function CreateInstance(const unkOuter: IUnknown; const iid: TIID; out obj): HResult; stdcall;
    function LockServer(fLock: BOOL): HResult; stdcall;

    function GetTypeInfoCount(out Count: Integer): HResult; stdcall;
    function GetTypeInfo(Index, LocaleID: Integer; out TypeInfo): HResult; stdcall;
    function GetIDsOfNames(const IID: TGUID; Names: Pointer;
      NameCount, LocaleID: Integer; DispIDs: Pointer): HResult; stdcall;
    function Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer;
      Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): HResult; stdcall;
end;

constructor tclass.Create;
begin
   cntref := 0;
end;

function tclass._AddRef: Integer;
begin
writeln('AddRef ',cntref);
   inc(cntref);
   result := cntref;
end;

function tclass._Release: Integer;
begin
writeln('Release', cntref);
   dec(cntref);
   result := cntref;
   if cntref = 0 Then self.Free;
end;

function tclass.QueryInterface(const IID: TGUID; out Obj): HResult;
var s: string;
begin
writeln('QueryInterface');
writeln(GUIDtoString(iid));

   result := 0;

   s := GuidToString(iid);

   if s = '{00000000-0000-0000-C000-000000000046}' then
      IInterface(obj) := IUnknown(self)
   else
   if s = '{00000001-0000-0000-C000-000000000046}' then
      IInterface(obj) := IClassFactory(self)
   else
   if s = '{00020400-0000-0000-C000-000000000046}' then
      IInterface(obj) := IDispatch(self)
   else begin
      writeln('nointerface');
      result := E_NOINTERFACE;
   end;

end;

//*************************************************************************
function tclass.CreateInstance(const unkOuter: IInterface; const iid: TIID; out obj): HResult;
begin
writeln('CreateInstance');
   result := QueryInterface(iid, obj);
end;

function tclass.LockServer(fLock: BOOL): HResult;
begin
writeln('LockServer');
   result := -1;
end;

//*************************************************************************
function tclass.GetIDsOfNames(const IID: TGUID; Names: Pointer; NameCount,
  LocaleID: Integer; DispIDs: Pointer): HResult;
begin
writeln('GetIDsOfNames');
   result := -1;
end;

function tclass.GetTypeInfo(Index, LocaleID: Integer; out TypeInfo): HResult;
begin
writeln('GetTypeInfo');
   result := -1;
end;

function tclass.GetTypeInfoCount(out Count: Integer): HResult;
begin
writeln('GetTypeInfo');
   result := -1;
end;

function tclass.Invoke(DispID: Integer; const IID: TGUID;
  LocaleID: Integer; Flags: Word; var Params; VarResult, ExcepInfo,
  ArgErr: Pointer): HResult;
begin
writeln('Invoke');
   result := -1;
end;

var cl: TClass;
    resreg: integer;
    h: hresult;
    msg: tagMSG;
    hw: HWND;
    iid: TGuid;

begin
  CoInitializeEx(nil, 0);

  cl := TClass.Create;

  iid := StringToGuid('{044F0B62-51BE-4225-865B-8AFD554107CC}');

  //h := CoRegisterClassObject( iid, cl, CLSCTX_LOCAL_SERVER, REGCLS_MULTI_SEPARATE, resreg);
  h := CoRegisterClassObject( iid, IUnknown(cl), 4, 2, resreg);

  FillChar(msg, sizeof(msg), 0);
  hw := 0;
  while GetMessage(msg, hw, 0, 0) do Begin
     TranslateMessage(msg);
     DispatchMessage(msg);
  end;

end.

(я ее как то даже здесь уже постил), другая... она сложно перевариваема, и ее приводить неимеет смысла, но код примерно такой же.
Так вот. Дельфевый код не создает объект, а на другой языке создается. Вот их логи:
Код

// это не дельфевая
(`AddRef,0)
(`AddRef,1)
`QueryInterface
"{00000001-0000-0000-C000-000000000046}"
(`AddRef,2)
(`Release,3)
`CreateInstance
`QueryInterface
"{00000000-0000-0000-C000-000000000046}"
(`AddRef,2)
(`AddRef,3)
`QueryInterface
"{00000003-0000-0000-C000-000000000046}"
"nointerface"
`QueryInterface
"{0000001B-0000-0000-C000-000000000046}"
"nointerface"
`QueryInterface
"{00000000-0000-0000-C000-000000000046}"
(`AddRef,4)
(`AddRef,5)
`QueryInterface
"{00000018-0000-0000-C000-000000000046}" // здесь начинаются различия
"nointerface"
`QueryInterface
"{00000019-0000-0000-C000-000000000046}"
"nointerface"
`QueryInterface
"{4C1E39E1-E3E3-4296-AA86-EC938D896E92}"
"nointerface"
(`Release,6)
(`Release,5)
(`Release,4)
(`Release,3)
`QueryInterface
"{00000126-0000-0000-C000-000000000046}"
"nointerface"
`QueryInterface
"{00020400-0000-0000-C000-000000000046}"
(`AddRef,2)
(`AddRef,3)

Код

AddRef 0
AddRef 1
QueryInterface
{00000001-0000-0000-C000-000000000046}
AddRef 2
Release3
CreateInstance
QueryInterface
{00000000-0000-0000-C000-000000000046}
AddRef 2
AddRef 3
QueryInterface
{00000003-0000-0000-C000-000000000046}
nointerface
QueryInterface
{0000001B-0000-0000-C000-000000000046}
nointerface
QueryInterface
{00000000-0000-0000-C000-000000000046}
AddRef 4
AddRef 5
QueryInterface
{00000001-0000-0000-C000-000000000046} // вот здесь не запрашивает как в пред IStdMarshal
                                                                          // вместо этого снова IClassFactory
AddRef 6
Release7
CreateInstance
QueryInterface
{00000000-0000-0000-C000-000000000046}
AddRef 6
AddRef 7
QueryInterface
{00000003-0000-0000-C000-000000000046}
nointerface
QueryInterface
{0000001B-0000-0000-C000-000000000046}
nointerface
QueryInterface
{00000000-0000-0000-C000-000000000046}
AddRef 8
AddRef 9
QueryInterface
{00000001-0000-0000-C000-000000000046}
...
и дальше еще куча запросов

Так вот, почему дельфевая програ ведет себя по другому, и в результате не создает объект?
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: ActiveX/СОМ/CORBA"

Rrader
Girder

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Delphi
  • Вопросы по SQL и вопросы по базам данных, не связанные с Delphi, задавать здесь

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Rrader, Girder.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: ActiveX/СОМ/CORBA | Следующая тема »


 




[ Время генерации скрипта: 0.0423 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.