Почему нам все еще нужен .lib тупиковый файл, когда у нас есть фактическая .dll реализация?

Если ваш rename не поддерживает -N, вы можете сделать что-то вроде этого:

ls -1 -c | xargs rename -n 's/.*/our $i; sprintf("%04d.jpg", $i++)/e'

Изменить Чтобы начать с заданного числа, вы можете использовать (несколько уродливые ) ниже, просто замените 123 номером, который вы хотите:

ls -1 -c | xargs rename -n 's/.*/our $i; if(!$i) { $i=123; } sprintf("%04d.jpg", $i++)/e'

Это упорядочивает файлы по времени создания (сначала сначала добавьте -r в ls, чтобы отменить сортировку), а затем отправляет этот список файлов для переименования. Переименование использует Perl-код в регулярном выражении для форматирования и увеличения счетчика.

Однако, если вы имеете дело с изображениями JPEG с информацией EXIF, я бы рекомендовал exiftool

. Это из документации exiftool в разделе «Примеры переименования»

   exiftool '-FileName

18
задан geeko 18 August 2009 в 23:14
поделиться

1 ответ

Я могу придумать несколько причин.

  • Использование файлов .lib означает, что вы можете создать версию DLL, отличную от той, которая установлена ​​в вашей системе, при условии, что у вас установлен правильный SDK.
  • Составители & amp; компоновщики должны поддерживать кроссплатформенные компиляции - вы можете создавать 64-битную цель на 32-битной платформе и наоборот и не иметь правильной библиотеки DLL архитектуры.
  • .lib-файлы позволяют вам «скрывать» определенные части вашей реализации - у вас может быть личный экспорт, который не отображается в .lib, но обнаруживается через GetProcAddress. Вы также можете выполнить порядковый экспорт, и в этом случае они не экспортируют понятное имя, но могут иметь понятное имя в .lib.
  • Родные библиотеки DLL не имеют строгих имен, поэтому может оказаться возможным подобрать неправильную версию библиотеки DLL.
  • И самое главное, эта технология была разработана в 1980-х годах. Если бы он был разработан сегодня, он, вероятно, был бы ближе к тому, что вы описываете - например, .NET, вам просто нужно сослаться на целевую сборку, и у вас есть все, что нужно для ее использования.

Я не знаю ни одного способа сделать неявное связывание исключительно с DLL - быстрый поиск выявил несколько инструментов, но я не использовал ни одного из них.

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

// using global variables and no-error handling for brevity.

HINSTANCE theDll = NULL;
typedef void (__stdcall * FooPtr)();
FooPtr pfnFoo = NULL;
INIT_ONCE initOnce;

BOOL CALLBACK BindDLL(PINIT_ONCE initOnce, PVOID parameter, PVOID context)
{
    theDll = LoadLibrary();
    pfnfoo = GetProcAddress(dll, "Foo");

    return TRUE;
}

// Export for foo
void Foo()
{
    // Use one-time init for thread-safe lazy initialization
    InitOnceExecuteOnce(initOnce, BinDll, NULL, NULL)
    pfnFoo();
}
8
ответ дан 30 November 2019 в 09:36
поделиться
Другие вопросы по тегам:

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