Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi (до версии 2009) - часть 6

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125

Открыть новую тему     Написать ответ в эту тему

ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Продолжение темы Вопросы по Delphi (до версии 2009) - часть 5

Познаем сами, помогаем другим...
Обсуждаем вопросы, не связанные с юникоидными версиями Delphi - для этого есть соответствующая тема (см. ссылки ниже).


 
Правила топика:
    Прежде чем спрашивать:
  1. Желательно изучить вопрос, попытаться найти ответ в прилагаемых мануалах, хелпах и анализируя исходники.
  2. Выполнить поиск по топику (открыть "Версия для печати" и поискать ответ там).
  3. Применить фильтр по разделу "Прикладное программирование". Ответы на многие старые вопросы могли быть даны в отдельных темах.
  4. Продумайте вопрос. На поверхностные вопросы вы получите поверхностные ответы, или вообще ответов не получите.
  5. Желательно указывать версии используемого компилятора и операционной системы.
    Прежде чем отвечать:
  1. Если не можете помочь, не мешайте.
  2. Если уж вы отвечаете на вопрос, давайте ответ по сути.
  3. Если вы не уверены, так и говорите! Ошибочный, но авторитетно звучащий ответ хуже, чем отсутствие ответа.
  4. Задавайте дополнительные вопросы, чтобы получить больше информации.
  • Отсутствие ответа не равносильно игнорированию - иногда участники форума просто не знают ответ. Повторная посылка вопроса не приветствуется. Посты типа "неужели никто не знает ответа..." или "может мне все-таки кто-нибудь ответит" недопустимы.  
  • Все большие куски кода (более 5 строк) оформляем в тег [morе] дабы уменьшить размер поста. FAQ по тегу [morе].


    Некоторые "родственные" топики:
     
  • Вопросы по Delphi (версии 2009-2010 Weaver)
  • Вопросы по компонентам для Delphi, C++ Builder
  • Использование DevExpress
  • Вопросы по Ehlib
  • Компоненты и утилиты для Delphi/BCB/FreePascal/Lazarus - только Open Source
  • Коммерческие компоненты и утилиты для Delphi/BCB
  • кабак программистов :)
     
    См. также: Некоторые полезные ресурсы о Delphi
     
    И старайтесь, чтобы ваш код не попал сюда :)

  • Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 05:13 19-05-2010 | Исправлено: akaGM, 02:33 15-07-2020
    Arberes

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    В файле autorun.inf написано следующее:
     
    [AutoRun]
    open=Install.exe
    icon=delphi.ico, 0
     
    [CONFIG]
    SKU=DELPHI_NET_ENT
     
    Но по большому счёту это не важно. Я пробовал и просто Install.exe запускать, и напрямую Setup.exe из папки Install. Самый интерес в том, что такая ерунда только на одном компьютере, потому что из этого дистрибутива я ставил как минимум на два компьютера уже, причём не по одному разу.

    Всего записей: 44 | Зарегистр. 31-10-2005 | Отправлено: 12:59 08-10-2010
    Andryshok



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Arberes Слушай, а не может такого быть, что среда уже была установлена ранее на машине на которой ты ставишь, и возможно некорректно удалена ? А, можт конфиг компонентов для установки сохранился и теперь инсталлер думает что они уже установлены ?

    Всего записей: 649 | Зарегистр. 03-06-2009 | Отправлено: 14:18 08-10-2010
    Arberes

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Попробовал на другом компе, где уже установлена эта Делфи. Нормально показывает все компоненты, несмотря на то, что они уже установлены.
    В любом случае, удалил из реестра, из Program Files, из Application Data всё, что связано с Codegear. «Borland» боюсь, ибо установлен InterBase v7.0, который создаёт кучу ключей «Borland». Что ещё можно удалить? Или как?

    Всего записей: 44 | Зарегистр. 31-10-2005 | Отправлено: 16:58 08-10-2010
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Arberes
    Может попробовать запускать инсталлер с ключами? Как минимум "/upgrade" стоит попробовать.

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 20:52 08-10-2010
    Sarge1978



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Доброго времени суток!
    Можно ли как-то подменить стандартный Memory Manager в Runtime, а не в процессе компиляции?

    Всего записей: 134 | Зарегистр. 12-03-2005 | Отправлено: 19:21 12-10-2010
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Sarge1978
    Конечно можно, специально для этого в модуле System есть процедуры Get/SetMemoryManager. Они используются например в ShareMem. Только делать это надо как можно раньше, не зря ShareMem всегда требуется объявлять первым юнитом в dpr-файле.

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 19:34 12-10-2010 | Исправлено: Frodo_Torbins, 19:36 12-10-2010
    Sarge1978



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Frodo_Torbins
    Вот и я о том же. Это делается на этапе загрузки приложения. А так, чтобы не подключать менеджеры в файле проекта?  
    Нигде не нашел, как это можно сделать корректно в процессе работы программы. Куча нюансов, если используются DLL-ли.

    Всего записей: 134 | Зарегистр. 12-03-2005 | Отправлено: 22:12 12-10-2010 | Исправлено: Sarge1978, 22:31 12-10-2010
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Sarge1978
    Можно и в процессе работы программы. При этом нужно следить, чтобы для каждого объекта и выделял и освобождал память один и тот же менеджер. Мне кажется, что если такое и удастся реализовать, то практической пользы будет не много.
    Вы бы лучше объяснили для чего вам это надо, возможно найдется более подходящий способ. К примеру у объекта можно переопределить методы NewInstance и FreeInstance, которые отвечают за выделение памяти под него.

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 23:19 12-10-2010 | Исправлено: Frodo_Torbins, 14:52 13-10-2010
    Sarge1978



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Frodo_Torbins
    Мне по заданию необходимо в процессе работы target программы подменять менеджер памяти на свой. Причем, извне. Так чтобы внешняя программа/процесс, который бы это делал(а) получал полный контроль над памятью целевой программы и всех ее DLL. В идеале, чтобы все они имели одинаковый менеджер памяти (к примеру, внешней программы). Я видел, как это делает, к примеру, FastShareMem, но он вкомпиливается в код...  
    Это нужно для получения доступа к published свойствам объектов target программы.

    Всего записей: 134 | Зарегистр. 12-03-2005 | Отправлено: 13:05 13-10-2010 | Исправлено: Sarge1978, 13:08 13-10-2010
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Sarge1978
    Ох непростую вы себе задачу выбрали. Особенно если имеется ввиду не какая то конкретная, а любая Delphi-программа. В этом случае 100% действующих и правильных способов решения нету.
    Во первых упомяну волшебные функции Read/WriteProcessMemory, они позволяют работать с чужой памятью напрямую.
    Но если надо через менеджер памяти, то возникает первая проблема - нужно внедрить свой код в чужой процесс. В общем случае можно использовать хуки, ваше конкретное приложение может поддерживать плагины.
    Далее менеджер памяти. Я вам предлагаю не подменять чужой своим, а самому использовать чужой вместо своего. Сделать это лучше сразу после загрузки своей длл-ки в чужой процесс. Если целевой процесс использует FastShareMem или FastMM4 с включенной опцией шаринга менеджера, то организовать подмену будет довольно просто. Если ничего подобного нету, то вы попали Вот тут Вопрос № 76637 обсуждалось возможное решение, но оно требует проверки на всех выпущенных версиях делфи, и к тому же не дает 100% гарантии.

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 14:49 13-10-2010 | Исправлено: Frodo_Torbins, 20:00 13-10-2010
    finnk

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Всем привет.Есть код процедуры удаления элемента из списка(односвязный список):

    Код:
    procedure DeleteValue(var pos, head: list);
    var
      p: list;
    begin
      if head = nil then Exit;
     
      if head.next = nil then
      begin
        MakeNull(head);
        Exit;
      end;
     
      if pos = head then
      begin
        head:= head.next;
        Exit;
      end;
     
      p:= head;
      while(p.next <> pos) do
      begin
        p:= p.next;
        if p = nil then Exit;//эт лишнее
      end;
      p.next:= p.next.next;
    end;

    Работает она норм, кроме одного случая, а именно если из списка удаляешь последний элемент.Суть в том, что элемент то это из списка удаляется, но потом уже при использовании процедур вставки элемента и вывода списка на экран визуально ничего не происходит, т.е. я добавляю элемент(если он все-таки добавляется в список), но он не выводится на экран.Может кто знает в чем проблема.Заранее спасибо.

    Всего записей: 6 | Зарегистр. 13-10-2010 | Отправлено: 08:30 14-10-2010
    smirnvlad

    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ошибка, видимо, не в этой процедуре
    может при вызове pos и head передаются в обратном порядке?
    ps. большие куски кода прячь под [more]

    Всего записей: 417 | Зарегистр. 31-03-2009 | Отправлено: 09:12 14-10-2010
    finnk

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    да не все передается правильно, вот все написанное и используемое мной для работы со списком, может кто и поможет
    Подробнее...

    Всего записей: 6 | Зарегистр. 13-10-2010 | Отправлено: 16:05 14-10-2010 | Исправлено: finnk, 16:10 14-10-2010
    smirnvlad

    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    finnk
    InsertValue не сохраняет целостность списка при вставке элемента в середину, а не конец, и не учитывает что pos может быть nil
    Подробнее...
     

    Всего записей: 417 | Зарегистр. 31-03-2009 | Отправлено: 16:37 14-10-2010
    finnk

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    smirnvlad
    неа, не помогло, тоже самое при удалении последнего элемента, могу выложить сам проект, но думаю там нет ошибки

    Всего записей: 6 | Зарегистр. 13-10-2010 | Отправлено: 18:34 14-10-2010 | Исправлено: finnk, 18:35 14-10-2010
    smirnvlad

    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    finnk
    ещё в загрузке списка
    InsertValue(x,head,pos);
    хотя pos может и не являться элементом списка (например, если список был очищен перед загрузкой), тогда при загрузке получается два списка один с началом в head из одного первого элемента, другой состоящий из всего остального загруженного, но указатель сохраняется в pos только для одного элемента (последнего загруженного)
     
    отсутствует освобождение памяти при удалении элементов, очистке списка, но, думаю, это влияет только на занимаемый объем памяти

    Всего записей: 417 | Зарегистр. 31-03-2009 | Отправлено: 19:23 14-10-2010
    finnk

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Цитата:
    ещё в загрузке списка  
    InsertValue(x,head,pos);  
    хотя pos может и не являться элементом списка (например, если список был очищен перед загрузкой), тогда при загрузке получается два списка один с началом в head из одного первого элемента, другой состоящий из всего остального загруженного, но указатель сохраняется в pos только для одного элемента (последнего загруженного)  

    чет я не понял твою мысль, а про

    Цитата:
    отсутствует освобождение памяти при удалении элементов, очистке списка, но, думаю, это влияет только на занимаемый объем памяти  

    известно,прост пока все на стадии разработки и потом будет учтено
     
     
    Добавлено:
    smirnvlad
    спасибо огромное за помощь, решил свою проблему))))если интересует как-пиши, выложу измененный код

    Всего записей: 6 | Зарегистр. 13-10-2010 | Отправлено: 19:47 14-10-2010 | Исправлено: finnk, 20:15 14-10-2010
    smirnvlad

    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    finnk
     

    Цитата:
    чет я не понял твою мысль, а про

    не, это я забыл что в конце вставки есть pos:= p;, так что там всё нормально
     
    если ошибка в выложенном коде, конечно напиши

    Всего записей: 417 | Зарегистр. 31-03-2009 | Отправлено: 20:42 14-10-2010 | Исправлено: smirnvlad, 20:45 14-10-2010
    finnk

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    вот верный код(по крайней мере мою во время работы программы ошибок обнаружено не было), ну и нужна норм очистка списка
    Подробнее...
    вот ссылка на код всей программы, может комы понадобиться, но она немного не доделана(освобождение памяти при очистке списка и удалении элемента, и еще не реализована сортировка)
    Ссылка

    Всего записей: 6 | Зарегистр. 13-10-2010 | Отправлено: 21:01 14-10-2010 | Исправлено: finnk, 21:27 14-10-2010
    Sarge1978



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Как получить InitContext через RVA модуля?

    Всего записей: 134 | Зарегистр. 12-03-2005 | Отправлено: 19:14 18-10-2010
    Открыть новую тему     Написать ответ в эту тему

    Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125

    Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi (до версии 2009) - часть 6


    Реклама на форуме Ru.Board.

    Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
    Modified by Ru.B0ard
    © Ru.B0ard 2000-2024

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru