none
DLL динамическое связывание RRS feed

  • Общие обсуждения

  • У меня проблема. Если основное приложение, к которому должны в процессе выполнения подключаться библиотеки интерфейсов (например, посредством выбора файла библиотеки).

    Функция подключения выглядит примерно так:

    typedef System::String^ (*ProcG) (LocalStorage::Storage^ storage);

    System::Void bFormTemplates_Click(System::Object^  sender, System::EventArgs^  e) {
    LPCWSTR s = (LPCWSTR)System::Runtime::InteropServices::Marshal::StringToHGlobalAuto("Pressure_text.dll").ToPointer();
    HINSTANCE hinstLib = LoadLibrary(s);
    if (hinstLib == NULL) { 
    System::Windows::Forms::MessageBox::Show("Невозможно загрузить библиотеку", "Ошибка"); 
    return;

    char* funcG = (char*)System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi("IDevGetData").ToPointer(); 
    ProcG g = (ProcG)GetProcAddress(hinstLib, (LPCSTR)funcG);
    System::Runtime::InteropServices::Marshal::FreeHGlobal((System::IntPtr)funcG);
    if (g == NULL) { 
    System::Windows::Forms::MessageBox::Show("Функция не найдена", "Ошибка"); 
    FreeLibrary(hinstLib);
    return;

    System::String^ string = g(LocalStorage::Storage^ storage);
    }

    И интерфейс библиотеки

    LIBRARY

    EXPORTS
    IDevGetData


    #using "LocalStorage.dll"

    System::String^ IDevGetData(LocalStorage::Storage^ s) 
    {
    return "";
    }

    При подключении библиотека вроде линкуется и функция тоже ( то есть NULL нигде нет). Но при вызове функции где-то выше по стеку удалось поймать исключение

    System Runtime.InteropServices. COMException (Ox80004005): Неопознанная ошибка (Исключение из HRESULT: Ох80004005 (E FAIL)) 
    в System.StubHelpers.InterfaceMarshaler.ConvertToManaged(IntPtr pUnk, Intptr пгМТ, Intptr classMT, Int32 flags) 
    в System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG & msg) 
    B System.Windows.Forms.Application.СomponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager. FРushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData) 
    B System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context) 
    в System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)

    в System. Windows. Forms. Application.Run(Form mainForm)

    в main(String[] args)

    Заранее спасибо за помощь!


    • Изменено Lantame 1 июня 2012 г. 6:41 Добавление
    • Изменен тип Lantame 1 июня 2012 г. 14:16
    • Изменен тип Abolmasov Dmitry 19 июня 2012 г. 13:56
    • Перемещено Abolmasov Dmitry 19 июня 2012 г. 13:56 (От:Языки программирования)

Все ответы

  • Привет.

    Может быть проблема в передаваемых параметрах в функцию? Можно проверить на функции без параметров, чтобы отладить сам вызов.


    Для связи [mail]

    4 июня 2012 г. 13:33