|
Вопрос # 4 974/ вопрос открыт / |
|
Доброго времени суток, уважаемые эксперты!
У меня есть прога. Пишется в Дельфи2010 на ВинХР. Тут все работает.
Но стоило запустить ее на Вин7, как работать перестала. Но если
запустить на Вин7 в режиме совместимости с ВинХР, то работает.
Прога работает с реестром и COM-портами, в т.ч. виртуальными.
Обмен с прибором через преобразователь на базе чипа FTDI.
Как сделать, чтобы работала без включения режима совместимости?
Или включать его самому, чтобы не привлекать к этому юзера.
Заранее спасибо!
 |
Вопрос задал: 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™ (статус: Доктор наук), 28 января 2011, 11:57 [#1]:
Цитата (Muratov Radik):
Но стоило запустить ее на Вин7, как работать перестала.
Конечно, мы тут все телепаты, сразу угадаем, как ведёт себя прога под вин 7, какие сообщения об ошибках выдаёт, какие записи в системном журнале появляются и т.д.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Вадим К (статус: Академик), 28 января 2011, 12:31 [#2]:
Проще отказаться от Вин7. Да, именно отказаться. Либо изучить, как подымать себе привилегии, как их корректно запрашивать у системы, как составить файл манифеста.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
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 (статус: Посетитель), 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 (статус: Посетитель), 28 января 2011, 15:13 [#6]:
100% проблема с правами на чтение списка портов
переходи на unix-системы
там права - это права, а не рюшки
Ⓐ свобода сопротивление солидарность
|
|
Muratov Radik (статус: Посетитель), 28 января 2011, 15:23 [#7]:
проблема решилась проще, чем ожидалось. Надо запускать прогу по правой кнопкой мыши и там выбрать Запуск от имени администратора.
Хотя конечно это тоже не очень удобно. Видимо все-таки манифесты надо копать
|
|
Егор (статус: 10-ый класс), 28 января 2011, 15:34 [#8]:
на мсдн-е была статья, которая примерно так и называлась - "особенности программирования под вин7" или "отличия в программировании под вин7 и вин хр". ссылку не подскажу - не помню
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
|
|
Muratov Radik (статус: Посетитель), 2 февраля 2011, 16:59 [#9]:
На русском мсдн-е?
|
|
Егор (статус: 10-ый класс), 2 февраля 2011, 18:20 [#10]:
нет, на майкрософте. и статья была на английском
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|