ERROR_INVALID_PARAMETER при LoadLibrary
От: nugaev.t  
Дата: 20.10.11 07:24
Оценка:
Здравствуйте. Второй день бьюсь с тривиальной задачей загрузки Dll.
Проблема:
Имеется dll, разработка ведется на Win7, VS2010 . Тестирование ведется на машине с WinXP SP3 для отладки там установлена VS2010.
До вчерашнего дня с загрузкой библиотеки никаких проблем не возникало.
Скомпилированная на машине с Win7 библиотека на машине WinXP загружается без проблем,
но скомпилированная на WinXP библиотека не грузится ни на XP ни на Win7 с ошибкой 87 (ERROR_INVALID_PARAMETER).
Размер у библиотек разный.
Рассмотрел вариант с зависимостями с отложенной загрузкой, Dependency Walker ничего не показал.
Написал примитивную тестовую длл и тестовое приложение — результат тот же самый.

Тестовая dll:
#include <Windows.h>

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    return TRUE;
}

extern "C" __declspec(dllexport) int __stdcall Test()
{
    return TRUE;
}



Тестовое application:

#include "stdafx.h"
#include <Windows.h>


int _tmain(int argc, _TCHAR* argv[])
{
    HMODULE hDll = LoadLibrary(L"C:\\Temp\\TestLib.dll");
    int error = GetLastError();
    return 0;
}


Как человек не профильно программирующий на C++ вероятно я упустил какую то очевидную вещь.
Надеюсь на помощь=)
Re: ERROR_INVALID_PARAMETER при LoadLibrary
От: okman Беларусь https://searchinform.ru/
Дата: 20.10.11 07:37
Оценка:
Здравствуйте, nugaev.t.

Какое именно значение возвращает LoadLibrary ?
Re[2]: ERROR_INVALID_PARAMETER при LoadLibrary
От: nugaev.t  
Дата: 20.10.11 07:47
Оценка:
Здравствуйте, okman, Вы писали:

O>Здравствуйте, nugaev.t.


O>Какое именно значение возвращает LoadLibrary ?


LoadLibrary возвращает 0, GetLastError возвращает код ошибки 87.
Re[3]: ERROR_INVALID_PARAMETER при LoadLibrary
От: okman Беларусь https://searchinform.ru/
Дата: 20.10.11 07:59
Оценка:
Здравствуйте, nugaev.t, Вы писали:

NT>LoadLibrary возвращает 0, GetLastError возвращает код ошибки 87.


Есть такие предположения:

1. dll требует для загрузки библиотек MSVCR или MSVCP нужных версий, которые не установлены.
2. exe и dll слинкованы с разными версиями MSVCR/MSVCP — из-за этого вполне может быть конфликт.
3. У папки C:\Temp отсутствуют права "Read and Execute" для данного пользователя.

Пока все.
Если покажете .vcxproj-файлы обоих проектов (exe и dll), возможно, скажу больше.
Re[4]: ERROR_INVALID_PARAMETER при LoadLibrary
От: nugaev.t  
Дата: 20.10.11 08:43
Оценка:
Сейчас проверяю предложенные Вами варианты. Пока выкладываю файлы проектов.

Файл проекта dll:


<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemGroup Label="ProjectConfigurations">
    <ProjectConfiguration Include="Debug|Win32">
      <Configuration>Debug</Configuration>
      <Platform>Win32</Platform>
    </ProjectConfiguration>
    <ProjectConfiguration Include="Release|Win32">
      <Configuration>Release</Configuration>
      <Platform>Win32</Platform>
    </ProjectConfiguration>
  </ItemGroup>
  <PropertyGroup Label="Globals">
    <ProjectGuid>{30072BF8-2990-4696-83EB-EC9463E34AEB}</ProjectGuid>
    <Keyword>Win32Proj</Keyword>
    <RootNamespace>TestLib</RootNamespace>
  </PropertyGroup>
  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
    <ConfigurationType>DynamicLibrary</ConfigurationType>
    <UseDebugLibraries>true</UseDebugLibraries>
    <CharacterSet>Unicode</CharacterSet>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
    <ConfigurationType>DynamicLibrary</ConfigurationType>
    <UseDebugLibraries>false</UseDebugLibraries>
    <WholeProgramOptimization>true</WholeProgramOptimization>
    <CharacterSet>Unicode</CharacterSet>
  </PropertyGroup>
  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
  <ImportGroup Label="ExtensionSettings">
  </ImportGroup>
  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
  </ImportGroup>
  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
  </ImportGroup>
  <PropertyGroup Label="UserMacros" />
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
    <LinkIncremental>true</LinkIncremental>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
    <LinkIncremental>false</LinkIncremental>
  </PropertyGroup>
  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
    <ClCompile>
      <PrecompiledHeader>
      </PrecompiledHeader>
      <WarningLevel>Level3</WarningLevel>
      <Optimization>Disabled</Optimization>
      <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;TESTLIB_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
    </ClCompile>
    <Link>
      <SubSystem>Windows</SubSystem>
      <GenerateDebugInformation>true</GenerateDebugInformation>
      <ModuleDefinitionFile>Export.def</ModuleDefinitionFile>
    </Link>
    <PostBuildEvent>
      <Command>xcopy /y "$(TargetPath)" "C:\Temp"</Command>
    </PostBuildEvent>
  </ItemDefinitionGroup>
  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
    <ClCompile>
      <WarningLevel>Level3</WarningLevel>
      <PrecompiledHeader>
      </PrecompiledHeader>
      <Optimization>MaxSpeed</Optimization>
      <FunctionLevelLinking>true</FunctionLevelLinking>
      <IntrinsicFunctions>true</IntrinsicFunctions>
      <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;TESTLIB_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
    </ClCompile>
    <Link>
      <SubSystem>Windows</SubSystem>
      <GenerateDebugInformation>true</GenerateDebugInformation>
      <EnableCOMDATFolding>true</EnableCOMDATFolding>
      <OptimizeReferences>true</OptimizeReferences>
      <ModuleDefinitionFile>Export.def</ModuleDefinitionFile>
    </Link>
  </ItemDefinitionGroup>
  <ItemGroup>
    <ClCompile Include="DllMain.cpp" />
  </ItemGroup>
  <ItemGroup>
    <None Include="Export.def" />
  </ItemGroup>
  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
  <ImportGroup Label="ExtensionTargets">
  </ImportGroup>
</Project>


Файл проекта приложения:

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemGroup Label="ProjectConfigurations">
    <ProjectConfiguration Include="Debug|Win32">
      <Configuration>Debug</Configuration>
      <Platform>Win32</Platform>
    </ProjectConfiguration>
    <ProjectConfiguration Include="Release|Win32">
      <Configuration>Release</Configuration>
      <Platform>Win32</Platform>
    </ProjectConfiguration>
  </ItemGroup>
  <PropertyGroup Label="Globals">
    <ProjectGuid>{11D93D5C-7D31-475F-BD68-EDE62684C4A6}</ProjectGuid>
    <Keyword>Win32Proj</Keyword>
    <RootNamespace>TestLoadLibrary</RootNamespace>
  </PropertyGroup>
  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
    <ConfigurationType>Application</ConfigurationType>
    <UseDebugLibraries>true</UseDebugLibraries>
    <CharacterSet>Unicode</CharacterSet>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
    <ConfigurationType>Application</ConfigurationType>
    <UseDebugLibraries>false</UseDebugLibraries>
    <WholeProgramOptimization>true</WholeProgramOptimization>
    <CharacterSet>Unicode</CharacterSet>
  </PropertyGroup>
  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
  <ImportGroup Label="ExtensionSettings">
  </ImportGroup>
  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
  </ImportGroup>
  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
  </ImportGroup>
  <PropertyGroup Label="UserMacros" />
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
    <LinkIncremental>true</LinkIncremental>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
    <LinkIncremental>false</LinkIncremental>
  </PropertyGroup>
  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
    <ClCompile>
      <PrecompiledHeader>
      </PrecompiledHeader>
      <WarningLevel>Level3</WarningLevel>
      <Optimization>Disabled</Optimization>
      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
    </ClCompile>
    <Link>
      <SubSystem>Console</SubSystem>
      <GenerateDebugInformation>true</GenerateDebugInformation>
    </Link>
  </ItemDefinitionGroup>
  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
    <ClCompile>
      <WarningLevel>Level3</WarningLevel>
      <PrecompiledHeader>
      </PrecompiledHeader>
      <Optimization>MaxSpeed</Optimization>
      <FunctionLevelLinking>true</FunctionLevelLinking>
      <IntrinsicFunctions>true</IntrinsicFunctions>
      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
    </ClCompile>
    <Link>
      <SubSystem>Console</SubSystem>
      <GenerateDebugInformation>true</GenerateDebugInformation>
      <EnableCOMDATFolding>true</EnableCOMDATFolding>
      <OptimizeReferences>true</OptimizeReferences>
    </Link>
  </ItemDefinitionGroup>
  <ItemGroup>
    <None Include="ReadMe.txt" />
  </ItemGroup>
  <ItemGroup>
    <ClInclude Include="stdafx.h" />
    <ClInclude Include="targetver.h" />
  </ItemGroup>
  <ItemGroup>
    <ClCompile Include="stdafx.cpp" />
    <ClCompile Include="TestLoadLibrary.cpp" />
  </ItemGroup>
  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
  <ImportGroup Label="ExtensionTargets">
  </ImportGroup>
</Project>
Re[5]: ERROR_INVALID_PARAMETER при LoadLibrary
От: okman Беларусь https://searchinform.ru/
Дата: 20.10.11 08:53
Оценка:
Здравствуйте, nugaev.t, Вы писали:

NT>Сейчас проверяю предложенные Вами варианты. Пока выкладываю файлы проектов.

NT>...

Что у Вас находится в файле Export.def ?
И еще. Попробуйте в настройках обоих проектов установить конфигурацию Release, а
в опциях компиляции, в разделе Code Generation/Runtime Library задать Multi-Threaded (/MT).
А потом пересобрать оба проекта и проверить — будет работать так или нет.
Re[4]: ERROR_INVALID_PARAMETER при LoadLibrary
От: nugaev.t  
Дата: 20.10.11 09:02
Оценка:
O>1. dll требует для загрузки библиотек MSVCR или MSVCP нужных версий, которые не установлены.
На сколько я понимаю если компилировать библиотеку и загружать ее на одной и той машине то проблем с версиями MSVCR и MSVCP быть не должно?

O>2. exe и dll слинкованы с разными версиями MSVCR/MSVCP — из-за этого вполне может быть конфликт.

Я пробовал загружать длл из управляемого кода без использования тестового приложения (через DllImport и через PInvoke LoadLibrary), результат тоже ошибочный.
Dll и Exe это проекты одного солюшна, возможно ли чтобы они линковались с разными версиями библиотек MSVCR/MSVCP?

O>3. У папки C:\Temp отсутствуют права "Read and Execute" для данного пользователя.

Пока не могу проверить, моя учетка на этой машине без админских прав. Но мне кажется если были проблемы с правами то
библиотека скомпилированная на Win7 из этой же папки тоже не загружалась. А она прекрасно загружается=(
Re[5]: ERROR_INVALID_PARAMETER при LoadLibrary
От: nugaev.t  
Дата: 20.10.11 09:03
Оценка:
Содержимое Export.def:

LIBRARY InjectedLib
EXPORTS
    Test
Re[6]: ERROR_INVALID_PARAMETER при LoadLibrary
От: nugaev.t  
Дата: 20.10.11 09:04
Оценка:
Упс пардон, не тот файл.
Вот правильный:
LIBRARY TestLib
EXPORTS
    Test
Re[5]: ERROR_INVALID_PARAMETER при LoadLibrary
От: okman Беларусь https://searchinform.ru/
Дата: 20.10.11 09:07
Оценка:
Здравствуйте, nugaev.t, Вы писали:

А можете выложить скомпилированные файлы exe и dll ?
Интересно посмотреть на такое поведение. Заодно я их через свои инструменты прогоню.
Re[6]: ERROR_INVALID_PARAMETER при LoadLibrary
От: nugaev.t  
Дата: 20.10.11 09:12
Оценка:
O>Попробуйте в настройках обоих проектов установить конфигурацию Release, а
O>в опциях компиляции, в разделе Code Generation/Runtime Library задать Multi-Threaded (/MT).
O>А потом пересобрать оба проекта и проверить — будет работать так или нет.
Попробовал — результат ошибочный.
Re[7]: ERROR_INVALID_PARAMETER при LoadLibrary
От: okman Беларусь https://searchinform.ru/
Дата: 20.10.11 09:15
Оценка:
Здравствуйте, nugaev.t, Вы писали:

O>>Попробуйте в настройках обоих проектов установить конфигурацию Release, а

O>>в опциях компиляции, в разделе Code Generation/Runtime Library задать Multi-Threaded (/MT).
O>>А потом пересобрать оба проекта и проверить — будет работать так или нет.
NT>Попробовал — результат ошибочный.

Мда, не припомню, чтобы такое видел.
Можете выложить куда-нибудь бинарники (exe и dll), а еще лучше — сам Solution ?
Re[8]: ERROR_INVALID_PARAMETER при LoadLibrary
От: okman Беларусь https://searchinform.ru/
Дата: 20.10.11 09:18
Оценка:
P.S.
Файл .sdf и директорию ipch из Solution можно не включать.
Re[9]: ERROR_INVALID_PARAMETER при LoadLibrary
От: nugaev.t  
Дата: 20.10.11 09:31
Оценка:
Здравствуйте, okman, Вы писали:

O>P.S.

O>Файл .sdf и директорию ipch из Solution можно не включать.

Залил бинарники, там рабочая версия библиотеки скомпиленная под Win7 и нерабочая под WinXP + тестовое приложение. Сейчас подготовлю и выложу солюшeн.
http://zalil.ru/31901385
Re[10]: ERROR_INVALID_PARAMETER при LoadLibrary
От: nugaev.t  
Дата: 20.10.11 09:46
Оценка:
Вот солюшн: http://zalil.ru/31901453
Re[10]: ERROR_INVALID_PARAMETER при LoadLibrary
От: nugaev.t  
Дата: 20.10.11 09:47
Оценка:
Здравствуйте, nugaev.t, Вы писали:

NT>Здравствуйте, okman, Вы писали:


O>>P.S.

O>>Файл .sdf и директорию ipch из Solution можно не включать.

Выложил солюшен: http://zalil.ru/31901453
Re[10]: ERROR_INVALID_PARAMETER при LoadLibrary
От: okman Беларусь https://searchinform.ru/
Дата: 20.10.11 10:34
Оценка:
Здравствуйте, nugaev.t, Вы писали:

NT>Залил бинарники, там рабочая версия библиотеки скомпиленная под Win7 и нерабочая под WinXP + тестовое приложение.


Удалось заметить вот что:
В рабочей dll-ке, которая собрана под Win7, есть манифест такого содержания:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel level="asInvoker" uiAccess="false"></requestedExecutionLevel>
      </requestedPrivileges>
    </security>
  </trustInfo>
</assembly>

Опции манифеста задаются в настройках компоновщика (Linker/Manifest File).
Однако в dll-ке, собранной под WinXP, он отсутствует (и в exe его тоже нет — видимо, сам exe
тоже собирался под WinXP).
Попробовал собрать Solution на Windows Server 2008 R2 — в обоих результирующих бинарниках манифест присутствует.
Re[11]: ERROR_INVALID_PARAMETER при LoadLibrary
От: nugaev.t  
Дата: 20.10.11 10:42
Оценка:
Спасибо! Сейчас попробую добавить манифест в XP версии прожекта.
А у Вас на машине загрузка XP версии библиотеки проходит без ошибок?
Re[12]: ERROR_INVALID_PARAMETER при LoadLibrary
От: okman Беларусь https://searchinform.ru/
Дата: 20.10.11 11:04
Оценка:
Здравствуйте, nugaev.t, Вы писали:

NT>Спасибо! Сейчас попробую добавить манифест в XP версии прожекта.

NT>А у Вас на машине загрузка XP версии библиотеки проходит без ошибок?

Нет, тоже обламывается.
Я еще вот что подумал — может быть, не очень хорошо с точки зрения совместимости
включать файл SDKDDKVer.h ? Ведь он настраивают макросы типа _WIN32_WINNT таким
образом, чтобы они указывали текущую версию Windows. То есть, ту, под которой
выполняется сборка, а не ту, на которой будет выполняться программа.

Для своих проектов я всегда делаю одинаковый файл targetver.h с примерно таким содержанием:

#pragma once

#define WINVER 0x0501
#define _WIN32_WINNT 0x0501
#define _WIN32_WINDOWS 0x0501
#define _WIN32_IE 0x0600

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

Хотя Ваш пример настолько минималистичен, что непонятно — где тут может быть несовместимость ?
Re[13]: ERROR_INVALID_PARAMETER при LoadLibrary
От: nugaev.t  
Дата: 20.10.11 11:15
Оценка:
Спасибо за ремарку, нужно будет переделать на свой файл с дефайнами.
Пока решил отложить решение проблемы. Нужно срочно заняться другой задачей. Огромное спасибо за помощь!!!
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.