none
Unable to load DLL RRS feed

  • Вопрос

  • А теперь по порядку. Есть WPF приложение, в котором подключается dll написанная на C. Dll-ка экспортирует функции с помощью def файла.

    LIBRARY    "DllInfo"
       
        EXPORTS
       
            ClearDllExportData
            ClearDllImportData
            ClearDllResourceData
            ClearGroupIconInfo

            ............................

     

    В WPF импорт происходит следующим образом:

     

     public class PEInfo
        {
            #region DllInfo

            [DllImport("DllInfo.dll")]
            static extern IntPtr GetImportFunctionData(uint ptrBase);

            [DllImport("DllInfo.dll")]
            static extern IntPtr GetImageResDirString(IntPtr ptrBase);

            [DllImport("DllInfo.dll")]
            static extern void ClearImportFunctionData(IntPtr ptrImportFuncData, int length);

            [DllImport("DllInfo.dll")]
            public static extern IntPtr GetHBitmap(IntPtr hInstance, uint id);

            .............................................................................................

     

    Проект состоит из 2-ух Dll-к (есть еще одна, правда сборка написанная на C#, на нее я думаю не стоит грешить) и EXE-ка, все это дело кидается на виртуальную машину на которой стоит Windows 7 Professional (без visual studio, ) после запуска Exe-ка, и пару манипуляций в программе, выдается следующее исключение.

    Unable to load DLL "DllInfo.dll": Не удалось запустить приложение, поскольку его параллельная конфигурация неправильна. Дополнительные сведения содержатся в журнале событий приложения или используйте программу командной строки sxstrace.exe для получения дополнительных сведений. (Exception from HRESULT:0x800736B1)

    На машине с Windows 7 Ultimate и установленной Visual Studio все нормально.

    Решил проверить на более мелком проекте. Создал одну Dll-ку и простенькое WPF приложение. При запуске сразу предлагает закрыть приложение (на WIndows 7 Pro, в Ultimate с Visual Studio опять таки все нормально).

    DLL

     

    .CPP

    #include "main.h"


    BOOL WINAPI DllMain (HINSTANCE hInst,DWORD dwReason, LPVOID IpReserved) {
        BOOL bAllWentWell=TRUE;
        switch (dwReason) {
                case DLL_PROCESS_ATTACH: // Инициализация процесса.

                    hInstanceMainLib = hInst;

                    break;
                case DLL_THREAD_ATTACH: // Инициализация потока.
                    break;
                case DLL_THREAD_DETACH: // Очистка структур потока.
                    break;
                case DLL_PROCESS_DETACH: // Очистка структур процесса.
                    break;
        }
        if(bAllWentWell) return TRUE;
        else return FALSE;
    }


    void Message(wchar_t *str)
    {
        MessageBox(NULL, str, str, MB_OK);
    }

    .H

    #include "Windows.h"

    HINSTANCE hInstanceMainLib;

     

    .DEF (ПРОБОВАЛ И ЧЕРЕЗ  extern "c" __delspec(dllexport), РЕЗУЛЬТАТ ТОТ ЖЕ)

    LIBRARY    "CDll"
       
        EXPORTS
       
            Message

     

    WPF

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;
    using System.Runtime.InteropServices;

    namespace WpfApplication2
    {
        /// <summary>
        /// Interaction logic for Window1.xaml
        /// </summary>
        public partial class Window1 : Window
        {
            [DllImport("CDll")]
            static extern void Message([MarshalAs(UnmanagedType.LPWStr)] String str);

            public Window1()
            {
                InitializeComponent();
            }
       
            void OnButtonClick(object sender, RoutedEventArgs e)
            {
                Message("Hello");
            }
       
        }
    }

     

    Помогите пожалуйста, не понимаю что нужно делать. Может какие-то настройки нужно указать, или еще что, я в тупике спасайте!

    P.S. Жду ответов, спасибо!

     

     

     

    19 декабря 2010 г. 14:01

Ответы

  • PashaPash, спасибо большое, разобрался.

     

    Если кому понадобится, нужно все DLL компилировать с настройками Release, ну и сам проект то же. Тогда можно спокойно переносить на другой комп.


    • Предложено в качестве ответа PashaPash 20 декабря 2010 г. 20:13
    • Помечено в качестве ответа Abolmasov Dmitry 21 декабря 2010 г. 8:51
    20 декабря 2010 г. 19:47

Все ответы

  • Вообщем подведу итог, при перенесении проекта содержащий С-шную dll, на другую машину, ругается что не может ее или не хочет ее (переносил с WIndows 7 Ultimate на Windows 7 Professional. Может дело все в правах? хотя мне так не кажется, или может какие-то опции нужно указать при компиляции? помогите кто чем может)

    Unable to load DLL "DllInfo.dll": Не удалось запустить приложение, поскольку его параллельная конфигурация неправильна. Дополнительные сведения содержатся в журнале событий приложения или используйте программу командной строки sxstrace.exe для получения дополнительных сведений. (Exception from HRESULT:0x800736B1)

    19 декабря 2010 г. 22:09
  • DLL написана на C, или все-таки на C++? Если второе, то установи на другую машину Microsoft Visual C++ 2010 Redistributable Package , или другой vcredist, нужной версии/битности.
    20 декабря 2010 г. 7:31
  • Синтаксис С-й, а вот сам проект.. (тут я и призадумался).Создаю так (Visual Studio 2008) File - > New Project - > Visual C++ -> Win32 -> Win32 Console Application. Дальше next отмечаю DLL и Empty project. FInish. Как я понимаю вроде С

    Поставил

    Microsoft Visual C++ 2010 Redistributable Package

    Microsoft Visual C++ 2008 Redistributable Package

    Microsoft Visual C++ 2005 Redistributable Package

     

    не помогло

    20 декабря 2010 г. 12:16
  • Есть еще один, для 2008 SP1:

    Microsoft Visual C++ 2008 SP1 Redistributable Package

    20 декабря 2010 г. 13:51
  • Установил, не работает. Может в параметрах линковщика или в дебагере нужно что-то указать? Просто даже такая маленька программка при нажатии на кнопку то же не срабатывает. После нажатия вылазит окно:

    Прекращение работы программы..

    Проверить наличие способа исправления ошибки...

    Закрыть программу

     

    DLL

     

    .CPP

    #include "main.h"


    BOOL WINAPI DllMain (HINSTANCE hInst,DWORD dwReason, LPVOID IpReserved) {
        BOOL bAllWentWell=TRUE;
        switch (dwReason) {
                case DLL_PROCESS_ATTACH: // Инициализация процесса.

                    hInstanceMainLib = hInst;

                    break;
                case DLL_THREAD_ATTACH: // Инициализация потока.
                    break;
                case DLL_THREAD_DETACH: // Очистка структур потока.
                    break;
                case DLL_PROCESS_DETACH: // Очистка структур процесса.
                    break;
        }
        if(bAllWentWell) return TRUE;
        else return FALSE;
    }


    void Message(wchar_t *str)
    {
        MessageBox(NULL, str, str, MB_OK);
    }

    .H

    #include "Windows.h"

    HINSTANCE hInstanceMainLib;

     

    .DEF (ПРОБОВАЛ И ЧЕРЕЗ  extern "c" __delspec(dllexport), РЕЗУЛЬТАТ ТОТ ЖЕ)

    LIBRARY    "CDll"
       
        EXPORTS
       
            Message

     

    WPF

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;
    using System.Runtime.InteropServices;

    namespace WpfApplication2
    {
        /// <summary>
        /// Interaction logic for Window1.xaml
        /// </summary>
        public partial class Window1 : Window
        {
            [DllImport("CDll")]
            static extern void Message([MarshalAs(UnmanagedType.LPWStr)] String str);

            public Window1()
            {
                InitializeComponent();
            }
       
            void OnButtonClick(object sender, RoutedEventArgs e)
            {
                Message("Hello");
            }
       
        }
    }

     

    копирую только папку debug

    20 декабря 2010 г. 16:40
  • А просто консольное приложение на C++ (не CLR) работает? Ругается все еще на "параллельную конфигурацию?" Под какие платформы собраны dll и exe?

    Попробуй обернуть вызов Message в try/catch и вывести детали исключения.

    20 декабря 2010 г. 17:13
  • PashaPash, спасибо большое, разобрался.

     

    Если кому понадобится, нужно все DLL компилировать с настройками Release, ну и сам проект то же. Тогда можно спокойно переносить на другой комп.


    • Предложено в качестве ответа PashaPash 20 декабря 2010 г. 20:13
    • Помечено в качестве ответа Abolmasov Dmitry 21 декабря 2010 г. 8:51
    20 декабря 2010 г. 19:47