Как я переименовываю DLL, но все еще позволяю EXE находить его?

Решение проблемы с использованием эмулятора

Папка /data может быть пустым, поскольку вам не хватает соответствующих разрешений. Чтобы решить эту проблему, мне пришлось выполнить следующие команды.

adb shell
su

Эти команды запускают оболочку в эмуляторе и предоставляют вам права root. Команда adb расположена в папке platform-tools Android SDK, обычно установленной в ~/Library/Android/sdk/ на MacOS.

chmod -R 777 /data

Измените разрешения папки (и подпапки рекурсивно) /data, чтобы они отображались в инструменте A ndroid Device Monitor .

adb root

Наконец, эта команда перезапускает adb с правами root. Будьте осторожны, он работает только на сборках разработки (как правило, с помощью эмуляторов).

Затем вы можете увидеть содержимое папки /data и перенести данные, расположенные внутри. Вы также можете сделать это в консоли , используя adb pull <remote> <locale>, например:

adb pull /data/data/<app name>/databases/<database> .
21
задан pauldoo 15 January 2009 в 09:46
поделиться

5 ответов

Вот хороший альтернативный подход: задержка, загружающаяся .

При создавании приложения, свяжите все это, как Вы были бы с исходным именем DLL (но установите origional dll, чтобы быть загруженной задержкой).

Вы затем развертываете DLL, переименованный согласно Вашему клиентскому запросу.

Ваш EXE попытается определить местоположение DLL с помощью настоящего имени, а не переименованная версия так перестанет работать, однако с задержкой, загружающей Вас, может прервать этот сбой и загрузить переименованную версию самих и затем иметь собственную твердость загрузчика окон все, как будто ничто не изменилось.

Read Поддержка Компоновщика статьи Загруженного Задержкой DLLs и посмотрите пример Delay Hook .

Ваш рычаг задержки мог бы быть чем-то как ниже:

FARPROC WINAPI delayHook( unsigned dliNotify, PDelayLoadInfo pdli )
{
    switch( dliNotify )
    {
        case dliNotePreLoadLibrary:
            if( strcmp( pdli->szDll, "origional.dll" ) == 0 )
                return (FARPROC)LoadLibrary( "renamed.dll" );
            break;
        default:
            return NULL;
    }

    return NULL;
}
17
ответ дан 29 November 2019 в 04:37
поделиться

Ваш клиент пьян? Из всех сумасшедших требований во всем мире...

Назад в мои славные дни как сифилитический полуночный программист на C++ сумасшедшего я раньше добавлял мой DLLs к моему .exe файлу как ресурсы. Затем при запуске я распаковал бы их и записал бы им в каталог exe. Ваша программа может выбрать имя файла DLL в этой точке. Действительно пойдите для вещи путаницы - запускаются со случайного числа, связывают некоторую поэзию Edward Lear и xor это с Вашим любимым немецким двуствольным существительным; должен сделать для начинающих так или иначе. Затем загрузите использование DLL LoadLibrary ().

enum ukOverwrite {dontOverwriteAnything = 0, overwriteWhateverPresent = 1};
void unpackResource (ukOverwrite param1, int resourceID, const char* basePath,  
const char* endFilename)
{
  char* lpName = 0;
  lpName += resourceID;
  HRSRC MrResource = FindResource (0, lpName, "file");

  if (MrResource)
  {
    HGLOBAL loadedResource = LoadResource (0, MrResource);
    if (loadedResource)
    {
      void* lockedResource = LockResource (loadedResource);
      if (lockedResource)
      {
        DWORD size = SizeofResource (0, MrResource);
        if (size)
        {
          unsigned long creationDisposition = CREATE_NEW;
          if (param1 == overwriteWhateverPresent)
            creationDisposition = CREATE_ALWAYS;

          char filepath [MAX_PATH];
          strcpy (filepath, basePath);
          strcat (filepath, endFilename);
          HANDLE rabbit = CreateFile (filepath, GENERIC_WRITE, 0, 0,  
creationDisposition, 0, 0);
          if (rabbit != INVALID_HANDLE_VALUE)
          {
            DWORD numBytesWritten = 0;
            int wf = WriteFile (rabbit, lockedResource, size, &numBytesWritten,  
0);
            CloseHandle (rabbit);
          }
        }
      }
      FreeResource (loadedResource);
    }
  }
}
6
ответ дан 29 November 2019 в 04:37
поделиться

Используя инструмент LIB (включенный с Visual Studio) можно генерировать библиотечный файл из файла определения. Asuming Ваш dll источник не включает файл определения, необходимо создать одно первое. Можно использовать dumpbin для помощи Вам. Например: dumpbin /exports ws2_32.dll

В выводе Вы видите названия экспортируемых функций. Теперь создайте файл определения как это:

LIBRARY WS2_32
EXPORTS
    accept      @1
    bind        @2
    closesocket @3
    connect     @4

@number является ординалом в выводе dumpbin

Использование LIB /MACHINE:x86 /def:ws2_32.def для генерирования библиотечного файла.

Теперь можно легко изменить файл определения и генерировать новый библиотечный файл каждый раз, когда Вы переименовываете свой dll.

можно проверить библиотечный файл с помощью dumpbin: dumpbin /exports ws2_32.lib. Необходимо получить тот же вывод как исходный библиотечный файл.

16
ответ дан 29 November 2019 в 04:37
поделиться

необходимо будет использовать блок. Загрузите и сохраните запутываемое имя сборки в app.config.

или это или использование тот же подход то использование плагинов. имейте класс в своей реализации блока интерфейс, который Вы ищете из своего приложения в каждом блоке в определенном каталоге. если найдено не желающий это. Вы не должны будете, конечно, запутывать Имя интерфейса.

-1
ответ дан 29 November 2019 в 04:37
поделиться
  1. Использование LoadLibrary (чтение нового имени из реестра) - это один из вариантов.
  2. Вы можете переименовать свой проект Visual Studio, получив общее название (с которым ваш заказчик не возражает).
  3. Саму DLL необходимо переименовать. Но библиотека по-прежнему носит старое имя? Вы перекрестно проверяли, используя файл DUMPBIN / ALL * .lib>. grep для старого имени DLL. Он все еще там? Проверьте файл * .def в проекте. Вы переименовали БИБЛИОТЕКУ в «OLDNAME»

В противном случае у LIB нет причин для хранения старого имени DLL.

0
ответ дан 29 November 2019 в 04:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: