Тема: Аналог (acet-reg-prodkey) на Delphi

Функция (acet-reg-prodkey), поставляемая с ExpressTools (AcetUtils.arx) возвращает примерно следующее:
"Software\\Autodesk\\AutoCAD\\R16.0\\ACAD-201:409".
Может кто знает как сделать такую-же функцию на Delphi?

Re: Аналог (acet-reg-prodkey) на Delphi

Вот реализация этой функции на VB:

Const acad = "SOFTWARE\Autodesk\AutoCAD\R16.0"
Dim hregkey As Long
Dim retval As Long
Dim stringbuffer As String
.....................................
' --- Находим текущую версию Автокада ---
' открываем раздел реестра HKEY_CURRENT_USER
  retval = RegOpenKeyEx(HKEY_CURRENT_USER, acad, 0, KEY_READ, hregkey)
  If retval <> 0 Then  ' ошибка во время открытия
    MsgBox "AutoCAD2004 не обнаружен", 16
  End If
' Получаем значение параметра "CurVer".
' Используем при этом ключевое слово ByVal
  stringbuffer = Space(255)  'создаем буфер для получения информации
  retval = RegQueryValueEx(hregkey, "CurVer", 0, REG_SZ, _
                      ByVal stringbuffer, Len(stringbuffer))  'получаем значение параметра
  stringbuffer = StrZToStr(stringbuffer)  'ACAD-201:409
' Закрываем раздел реестра HKEY_CURRENT_USER
  retval = RegCloseKey(hregkey)
stringbuffer = acad & "\" & stringbuffer

Думаю, что на Delphi переведешь без проблем.
Только зачем на Lispe использовать внешнюю функцию (acet-reg-prodkey), когда есть аналогичная стандартная (vlax-product-key)

Re: Аналог (acet-reg-prodkey) на Delphi

Спасибо, Игорь.
Насчет того для чего это нужно. В Lisp конечно есть функция VLAX-PRODUCT-KEY, но может ведь понадобиться знание этого ключа и при работе извне. К примеру, установка программ (внешним установщиком), когда нужно прописать что-то в автозагрузку AutoCAD, чтобы затем уже Lisp-программа завершила установку.

Re: Аналог (acet-reg-prodkey) на Delphi

Const acad = "SOFTWARE\Autodesk\AutoCAD\R16.0" - ЗАБЛУЖДЕНИЕ. Это только частный случай. А искать строку соединения надо от acad.exe. Может быть и несколько AutoCAD.

function ruFindAcadAppString(ExeName: string): string;
  function FindForAppVer(AcadApp, ExeName: string): string;
  var
    Acad_CLSID, AcadLocalServer32: string;
  begin
    Result := '';
    Acad_CLSID :='';
    AcadLocalServer32:='';
    try
        Acad_CLSID:= RegReadString(HKEY_CLASSES_ROOT, AcadApp + '\CLSID', '');
    except
    end;
    if (Acad_CLSID <> '') then begin
      try
          AcadLocalServer32:= RegReadString(HKEY_CLASSES_ROOT, 'CLSID\'+Acad_CLSID+'\LocalServer32','');
      except
      end;
      if  (AcadLocalServer32 <> '') then
        if StrFind(ExeName, AcadLocalServer32, 1) > 0 then
          Result := AcadApp;
     end;
  end;
begin
  Result := FindForAppVer('AutoCAD.Application', ExeName);
  if Result = '' then
    Result := FindForAppVer('AutoCAD.Application.15', ExeName);
  if Result = '' then
    Result := FindForAppVer('AutoCAD.Application.16', ExeName);
  if Result = '' then
    Result := FindForAppVer('AutoCAD.Application.16.1', ExeName);
end;

Зная, "как числится" нужный AutoCAD можно найти все остальное - достаточно покопаться в реестре.

Re: Аналог (acet-reg-prodkey) на Delphi

Да, R16.0 - это действительно частный случай. У R15.0 параметра "CurVer" в HKEY_CURRENT_USER - нету. Он у него в HKEY_LOCAL_MACHINE сидит (а у R16.0 наоборот).
В общем:

(= (= ShaggyDoc ShaggyDoc) T)

Re: Аналог (acet-reg-prodkey) на Delphi

> ShaggyDoc
Здравствуйте!
Извините, я сегодня тупой...
Не могли бы Вы прислать текст Вашей функции RegReadString (для полного счастья)?
Моя аналогичная функция упорно не хочет читать в реестре параметр с именем "(По умолчанию)".
Заранее спасибо.
FiШ