Проблема RunDll32 в Win2k с помощью Visual C ++ 2008 Express скомпилированной библиотеки DLL - PullRequest
1 голос
/ 18 февраля 2009

Во-первых, я не программист на C ++ (но я учусь). Мне наконец-то удалось изменить и скомпилировать исходный код на C ++ с использованием Visual C ++ 2008 Express Edition. Я пытался получить тот же код, скомпилированный в полной версии Visual C ++ 2003, но безуспешно (я получаю множество ошибок, но безуспешно).

Проблема в том, что все работает нормально, используя RunDll32 для вызова DLL в Windows Vista, но когда я пытаюсь выполнить тот же вызов rundll32 в Windows 2000, я получаю следующую ошибку:

"Ошибка загрузки mysampledll.dll" «Указанный модуль не найден.»

Конечно, я попытался установить полный путь, переместить файл и т. Д., Но не повезло. Я гарантирую, что файл существует и имеет правильные разрешения.

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

<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
        <requestedPrivileges>
            <requestedExecutionLevel level="requireAdministrator" uiAccess="false"></requestedExecutionLevel>
        </requestedPrivileges>
    </security>
    </trustInfo>
    <dependency>
        <dependentAssembly>
            <assemblyIdentity type="win32" name="Microsoft.VC90.DebugCRT" version="9.0.21022.8" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
        </dependentAssembly>
    </dependency>
    <dependency>
        <dependentAssembly>
            <assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.21022.8" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
    </dependentAssembly>
    </dependency>
</assembly>

Теперь я предполагаю, что проблема в том, что в Win2k не установлен Microsoft.VC90.CRT, но почему моя DLL имеет эту зависимость? В свойствах проекта я установил «Общеязыковая поддержка времени выполнения» на «Нет общеязыковой поддержки времени выполнения», так почему же он все еще требует CLR? Есть ли способ изменить манифест, чтобы использовать более старую среду выполнения Visual C ++, которая доступна по умолчанию в Win2k? Извините за мое невежество в этих вопросах и заранее благодарю за любую помощь.

Ответы [ 4 ]

0 голосов
/ 08 июня 2009

Обратите внимание, что вы также можете распространять библиотеки CRT вместе с вашим приложением, если вы не хотите, чтобы ваши пользователи запускали установщик CRT. Вы найдете их в каталоге установки VC по адресу redist \ x86 (C: \ Program Files \ Microsoft Visual Studio 9.0 \ VC \ redist \ x86 \ Microsoft.VC90.CRT - это полный путь на моем компьютере). Обратите внимание, что вы должны скопировать все четыре файла в этом каталоге (три DLL-файла и манифест) и поместить их рядом с вашим EXE-файлом, чтобы это работало должным образом.

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

0 голосов
/ 18 февраля 2009

Я бы сказал, что в Windows 2000 ваша DLL не загружается, потому что отсутствует зависимость.

Чтобы узнать, чего не хватает, скачав утилиту Зависит от , найденную здесь: http://www.dependencywalker.com/

Если MSCRT DLL перестает работать, вам нужно будет перераспределить эти DLL с вашей DLL.

0 голосов
/ 18 февраля 2009

Проблема в том, что вы пытаетесь запустить DLL, скомпилированную с отлаженной библиотекой C-Runtime (CRT), связанной с ней.

Чтобы устранить проблему, свяжите в не отладочном CRT с вашей DLL:

Вариант 1. Сборка и распространение версии выпуска. (Это то, что вы должны делать в любом случае, когда пришло время выпустить.) Для этого:

  • Элемент списка
  • Build.Configuration Manager ... и измените целевую версию с Debug на Release; или
  • Build.Batch Build ... и проверка отладки и выпуска; и
  • Используйте двоичные файлы, которые выходят из каталога Release.

Вариант 2. Создайте свои отладочные двоичные файлы с помощью неотладочного CRT. Для этого:

  • Элемент списка
  • Project.Properties ...
  • Перейдите к C / C ++, генерация кода
  • Для библиотеки времени выполнения выберите Многопоточная DLL или Многопоточная.

Я предпочитаю использовать вариант 2 для быстрых и грязных проектов, где мне нужна скорость розничного CLR, но мне нужна вся информация отладки для моего кода.

(Кстати, CLR! = CRT, но это другое обсуждение.)

0 голосов
/ 18 февраля 2009

Попробуйте установить Распространяемый пакет Visual Studio 2008 .

Содержит C ++ DLL времени выполнения, которая нужна вашей программе.

Не запутайся. Это не CLR. CLR предназначен для управляемого кода, а не для собственных исполняемых файлов Intel. Даже нативным исполняемым файлам нужна библиотека DLL времени выполнения Microsoft, если вы динамически связываете их с средой выполнения. Это значение по умолчанию в свойствах проекта, C ++, Генерация кода, Библиотека времени выполнения = Многопоточная DLL. Вы можете избежать этого, выбрав Многопоточность, которая будет статически ссылаться в коде библиотеки.

...