Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.04.2015, 20:11   #1
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию GetIDsOfNames. DISP_E_UNKNOWNNAME. Правильное использование.

Всем доброго. Продолжая изучать интерфейсы добрался до получения идентификатора метода с помошью. GetIDsOfNames.
Пробую так:
Код:
program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  comobj,
  activex,
  Windows,
  System.SysUtils;

var d:IDispatch;
  a:PWideChar;
  DispatchId: Longint;
  res:Integer;
begin
 CoInitialize(0);
 d:=CreateOleObject('MSScriptControl.ScriptControl');
 a:=StringToOleStr('Reset');
 res:=d.GetIDsOfNames(GUID_NULL,&a,1,LOCALE_SYSTEM_DEFAULT,@DispatchId);
 case res of
  S_OK:Writeln(DispatchId);
  E_OUTOFMEMORY:Writeln('E_OUTOFMEMORY');
  DISP_E_UNKNOWNNAME:Writeln('DISP_E_UNKNOWNNAME');
  DISP_E_UNKNOWNLCID:Writeln('DISP_E_UNKNOWNLCID');
  else Writeln(res);
 end;
 readln;
end.
В результате получаю DISP_E_UNKNOWNNAME.
Однако я точно знаю что такой метод есть, ибо использую его в своей программе так:
Код:
...
  Error:='';
  if VarIsClear(iVBS) then begin
    try
     CoInitialize(nil);
     iVBS:=CreateOleObject('MSScriptControl.ScriptControl');
     iVBS.Language:='VBScript';
     iVBS.UseSafeSubset := False;
     iVBS.AllowUI := true;
     iVBS.TimeOut := -1;
     iVBS.Reset;
    except
     on e:Exception do begin
      Error:='Error on created MSScriptControl: '+e.Message;
      iVBS:=Unassigned;
     end;
    end;
  end;
...
Отсюда у меня вопрос: А правильно ли я вообще делаю чтоб получить идентификатор?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 11.04.2015, 20:43   #2
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,774
По умолчанию

А почему PWideChar, а не WideString? Ведь WideString -- обертка над API COM-строк (BSTR), а интерфейсы -- это тоже COM. Всё это было введено в Delphi 4.
Vapaamies вне форума Ответить с цитированием
Старый 11.04.2015, 20:54   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Этот код я выдрал из генофонда, там именно PWideChar используется. Думаю нет смысла не доверять генофонду.
Тем паче что этот параметр ведь указатель на указатели, если я правильно понял.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 11.04.2015, 21:00   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

У меня на С все работает...
явно или конвертация имени или передача &a в качестве аргумента выдает что-то не то.
waleri вне форума Ответить с цитированием
Старый 11.04.2015, 21:30   #5
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,774
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Этот код я выдрал из генофонда, там именно PWideChar используется. Думаю нет смысла не доверять генофонду.
Быдлокод -- он быдлокод и есть, где бы ни находился. StringToOleStr -- наследие Delphi 3 и ниже. С Delphi 4 нужно использовать WideString.
Код:
const
  a: WideString = 'Reset';
var
  d:System.IDispatch;
  DispatchId: Integer;
  res:Integer;
begin
 d:=CreateOleObject('MSScriptControl.ScriptControl');
 res:=d.GetIDsOfNames(GUID_NULL, @A, 1, LOCALE_SYSTEM_DEFAULT,@DispatchId);
 case res of
  E_OUTOFMEMORY:ShowMessage('E_OUTOFMEMORY');
  DISP_E_UNKNOWNNAME:ShowMessage('DISP_E_UNKNOWNNAME');
  DISP_E_UNKNOWNLCID:ShowMessage('DISP_E_UNKNOWNLCID');
  else
    ShowMessage(IntToStr(res));
 end;
Проверял на VCL-приложении, поэтому переделал на ShowMessage. Показывает 0.

Последний раз редактировалось Vapaamies; 11.04.2015 в 21:32.
Vapaamies вне форума Ответить с цитированием
Старый 11.04.2015, 22:32   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Хм... Впервые усомнился в генофонде...
Сколько времени на него ровнялся, и вот тебе на...
Надеюсь таких несуразностей все же меньше в Делфи, спасибо за поправку. Плюсую.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 11.04.2015, 22:55   #7
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,774
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Хм... Впервые усомнился в генофонде...
К слову сказать, бесконтрольный вызов StringToOleStr приводит к утечке памяти. Полученный указатель нужно освобождать. WideString же делает это всё прозрачно.

Пишу для тех, кто найдет эту тему через поисковик.
Vapaamies вне форума Ответить с цитированием
Старый 12.04.2015, 08:14   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Пишу для тех, кто найдет эту тему через поисковик.
Я когда полностью освою вызов СОМ и ОЛЕ опишу в этой теме (связав ее со своей предидущей) чтоб действительно было другим что искать. Лично я примеров нормальных в инете не нашел. Под Делфи имеется ввиду.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 12.04.2015, 09:15   #9
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

А в чем разница между &a и @a
waleri вне форума Ответить с цитированием
Старый 12.04.2015, 09:40   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ой, это очепятка О_о
Конечно же @. Писал код с виртуальной машины, у которой еще не настроил буфер обмена, вот и пропустил символ. Не тот поставил.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
не правильное умножение IgoreKMaN Visual C++ 2 11.06.2013 21:36
Правильное использование кучи rengen Общие вопросы C/C++ 8 24.01.2012 13:22
Решение правильное маГГ85 PHP 2 15.12.2011 21:30
Правильное использование setw Андрей Чернуха Общие вопросы C/C++ 0 04.01.2011 21:24
Правильное использование IBTransaction Sparky БД в Delphi 0 23.05.2010 18:40