Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 4 974

/ вопрос открыт /

Доброго времени суток, уважаемые эксперты!

У меня есть прога. Пишется в Дельфи2010 на ВинХР. Тут все работает.
Но стоило запустить ее на Вин7, как работать перестала. Но если
запустить на Вин7 в режиме совместимости с ВинХР, то работает.
Прога работает с реестром и COM-портами, в т.ч. виртуальными.
Обмен с прибором через преобразователь на базе чипа FTDI.
Как сделать, чтобы работала без включения режима совместимости?
Или включать его самому, чтобы не привлекать к этому юзера.

Заранее спасибо!

Muratov Radik Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Muratov Radik (статус: Посетитель)
Вопрос отправлен: 28 января 2011, 11:37
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: amber

Здравствуйте, Muratov Radik!
Если есть возможность, установите делфи в Вин7 - это упростит процесс поиска ошибки в программе. Возможно Ваша программа использует напрямую или через VCL API функции, которые есть в XP, но которых нет в 7 либо они существенно изменены. Для решения данной проблемы рекомендую найти справку по API функциям работающих с COM портами в Win7. Сомневаюсь, что ошибка возникает при работе с реестром, поскольку изменения API в этой области в Win7 минимальны.

P.S. Было бы проще, если бы Вы привели текст ошибки. В большинстве своём программы отказываются работать в этой системе из за изменений в библиотеках самой системы, потому рекомендую внимательно изучить руководство по API в Win7.

Ответ отправил: amber (статус: 1-ый класс)
Время отправки: 2 февраля 2011, 13:28


Мини-форум вопроса

Всего сообщений: 10; последнее сообщение — 2 февраля 2011, 18:20; участников в обсуждении: 5.
min@y™

min@y™ (статус: Доктор наук), 28 января 2011, 11:57 [#1]:

Цитата (Muratov Radik):

Но стоило запустить ее на Вин7, как работать перестала.

Конечно, мы тут все телепаты, сразу угадаем, как ведёт себя прога под вин 7, какие сообщения об ошибках выдаёт, какие записи в системном журнале появляются и т.д.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Вадим К

Вадим К (статус: Академик), 28 января 2011, 12:31 [#2]:

Проще отказаться от Вин7. Да, именно отказаться. Либо изучить, как подымать себе привилегии, как их корректно запрашивать у системы, как составить файл манифеста.
Галочка "подтверждения прочтения" - вселенское зло.
Muratov Radik

Muratov Radik (статус: Посетитель), 28 января 2011, 13:23 [#3]:

Вадим К: Отказаться нереально. Все больше людей пересаживатеся на 7ку. Да и на ноутах она идет предустановленная. Подкажите куда копать по обозначенным Вами позициям?
min@y™: Вы правы, постановка вопроса абстрактная. Исправляюсь:
function TMainForm.PortFind(var devCount: integer): integer;
var
  reg : TRegistry;
  ts : TStrings;
  i : integer;
  l_FP: integer;
begin
  Result := 1;
  logMemo.Lines.Add('Пытаемся получить доступ к реестру');
try
    reg := TRegistry.Create;
    reg.RootKey := HKEY_LOCAL_MACHINE;
    reg.OpenKey('hardware\devicemap\serialcomm', false);
    ts  := TStringList.Create;
    reg.GetValueNames(ts);
    // сначала проверим, вдруг в данный момент активно несколько вирт.портов
    l_FP := 0;
    for i := 0 to ts.Count -1 do
     if Pos('VCP', UpperCase(ts.Strings[i])) > 0
      then l_FP := l_FP + 1;
    if l_FP > 1 then
     begin
       devCount := l_FP;
       Exit;
     end;
 
    l_FP := 1;
    for i := 0 to ts.Count -1 do
    begin
     logMemo.Lines.Add(ts.Strings[i]);
      if ts.Strings[i] = '\Device\VCP0' then
        begin
          l_FP := StrToInt(StringReplace(reg.ReadString(ts.Strings[i]), 'COM', '',
                            [rfReplaceAll, rfIgnoreCase]));
          break;
        end;
    end;
except
  ts.Free;
  reg.CloseKey;
  reg.free;
  logMemo.Lines.Add('Ошибка доступа к реестру');
end;
  ts.Free;
  reg.CloseKey;
  reg.free;
  logMemo.Lines.Add('Доступ к реестру получен');
  result := l_FP;
end;

Перестала работать эта функция. Вернее она "работает", ошибок никаких не возникает, просто она не находит номер COM-порта.
В ХР она выводит в мемо список всех портов, а в 7 нет.
Muratov Radik

Muratov Radik (статус: Посетитель), 28 января 2011, 13:29 [#4]:

Еще размер файла возвращает равным -1. Хотя файл есть и он нормальный
procedure TChangeWordBankCOMForm.OpenBtnClick(Sender: TObject);
var
  FHandle: Integer;
  FLength: Integer;
begin
  StatusBar.Panels[1].Text:= '';
  OpenDialog1.InitialDir := ExtractFilePath(Application.ExeName);
  if OpenDialog1.Execute then
    if FileExists(OpenDialog1.FileName) then
    begin
      //---------------------------------------------
      FHandle := FileOpen(FName, fmOpenRead);
      FLength := FileSeek(FHandle,0,2);
      FileClose(FHandle);
      Label3.Caption := IntToStr(FLength); // + ' bytes';
      //---------------------------------------------
      ProgressBar1.Min := 0;
      ProgressBar1.Max := FLength;
      ProgressBar1.Position := 0;
    end;
end;
Вадим К

Вадим К (статус: Академик), 28 января 2011, 14:03 [#5]:

Muratov Radik: Отказаться реально. Если нужно перепрошивать контроллеры или что там ещё делается по com порту, то севен тут сложнее для работы.
Если запустить программу с админскими привелегиями, то все работает?
Размер файла может возвращать -1, если к файлу нет доступа.
Галочка "подтверждения прочтения" - вселенское зло.
mirt.steelwater

mirt.steelwater (статус: Посетитель), 28 января 2011, 15:13 [#6]:

100% проблема с правами на чтение списка портов
переходи на unix-системы
там права - это права, а не рюшки
Ⓐ свобода сопротивление солидарность
Muratov Radik

Muratov Radik (статус: Посетитель), 28 января 2011, 15:23 [#7]:

проблема решилась проще, чем ожидалось. Надо запускать прогу по правой кнопкой мыши и там выбрать Запуск от имени администратора.
Хотя конечно это тоже не очень удобно. Видимо все-таки манифесты надо копать
Егор

Егор (статус: 10-ый класс), 28 января 2011, 15:34 [#8]:

на мсдн-е была статья, которая примерно так и называлась - "особенности программирования под вин7" или "отличия в программировании под вин7 и вин хр". ссылку не подскажу - не помню
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
Muratov Radik

Muratov Radik (статус: Посетитель), 2 февраля 2011, 16:59 [#9]:

На русском мсдн-е?
Егор

Егор (статус: 10-ый класс), 2 февраля 2011, 18:20 [#10]:

нет, на майкрософте. и статья была на английском
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:34
Выполнено за 0.03 сек.