| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Есть ли ограничения на LoadLibrary из ObjectArx ?

Есть ли ограничения на LoadLibrary из ObjectArx ?

Ответ
Поиск в этой теме
Непрочитано 11.03.2012, 13:05 #1
Есть ли ограничения на LoadLibrary из ObjectArx ?
alex-63
 
инженер
 
Брест
Регистрация: 15.09.2009
Сообщений: 55

Проблема загрузки DLL из objectArx.
Где искать ошибку?
Есть код который работает в проекте MFC Application.
Но почему то библиотека DLL, собранная в Visual Prologe
отказывается загружаться в objecArx.
*hLibrary = LoadLibrary( lpszLibrary ) ) выдает NULL.
Есть ли ограничения в ObjectArx и
как выяснить причину ошибки в LoadLibrary ?

Код:
[Выделить все]
 //-----------------------------------------------------------------------------
//----- acrxEntryPoint.cpp
//-----------------------------------------------------------------------------
#include "StdAfx.h"
#include "resource.h"

//-----------------------------------------------------------------------------
#define szRDS _RXST("AK")



//GetProcAddresses
//Argument1: hLibrary - Обработчик загружаемой библиотеки
//Argument2: lpszLibrary - Загружаемая библиотека
//Argument3: nCount - Количество загружаемых функций
//[Arguments Format]
//Argument4: Function Address - Адрес функции
//Argument5: Function Name -  Желаемое для нас имя функции
//[Repeat Format]
//
//Returns: FALSE if failure
//Returns: TRUE if successful
BOOL GetProcAddresses(HINSTANCE *hLibrary,LPCWSTR lpszLibrary,INT nCount,...)
{
   va_list va;
   va_start( va, nCount );

   if ( ( *hLibrary = LoadLibrary( lpszLibrary ) ) != NULL )
   {
      FARPROC * lpfProcFunction = NULL;
      LPSTR lpszFuncName = NULL;
      INT nIdxCount = 0;
      while ( nIdxCount < nCount )
      {
         lpfProcFunction = va_arg( va, FARPROC* );
         lpszFuncName = va_arg( va, LPSTR );
         if ( ( *lpfProcFunction = GetProcAddress( *hLibrary,
                                             lpszFuncName ) ) == NULL )
         {
            lpfProcFunction = NULL;
            return FALSE;
         }
         nIdxCount++;
      }
   }
   else
   {
      va_end( va );
      return FALSE;
   }
   va_end( va );
   return TRUE;
}





//-----------------------------------------------------------------------------
//----- ObjectARX EntryPoint
class CtestLoadDLLApp : public AcRxArxApp {

public:
    CtestLoadDLLApp () : AcRxArxApp () {}

    virtual AcRx::AppRetCode On_kInitAppMsg (void *pkt) {
        // TODO: Load dependencies here

        // You *must* call On_kInitAppMsg here
        AcRx::AppRetCode retCode =AcRxArxApp::On_kInitAppMsg (pkt) ;
        
        // TODO: Add your initialization code here

        return (retCode) ;
    }

    virtual AcRx::AppRetCode On_kUnloadAppMsg (void *pkt) {
        // TODO: Add your code here

        // You *must* call On_kUnloadAppMsg here
        AcRx::AppRetCode retCode =AcRxArxApp::On_kUnloadAppMsg (pkt) ;

        // TODO: Unload dependencies here

        return (retCode) ;
    }

    virtual void RegisterServerComponents () {
    }


    // - AKtestLoadDLL._vip command (do not rename)
    static void AKtestLoadDLL_vip(void)
    {
        // Add your code for command AKtestLoadDLL._vip here
// функции из User32.dll
typedef int ( WINAPI *MESSAGEBOX ) ( HWND , LPCSTR, LPCSTR, DWORD );
typedef int ( WINAPI *MESSAGEBOXEX ) (HWND , LPCSTR, LPCSTR, DWORD , WORD);
// функция из vipdb.dll
typedef int ( WINAPI *exportedPredicate ) (void);

MESSAGEBOX lpfMsgBox = NULL;
MESSAGEBOXEX lpfMsgBoxEx = NULL;

exportedPredicate lpfexportedPredicate  = NULL;

HINSTANCE hLib;
   if(GetProcAddresses( &hLib, _T("User32.dll"), 2,
                        &lpfMsgBox, "MessageBoxA",
                        &lpfMsgBoxEx, "MessageBoxExA" ) )
   {
       lpfMsgBox( 0, "Test1", "Test1", MB_OK );
       lpfMsgBoxEx( 0, "Test2", "Test2", MB_OK, MAKELANGID( LANG_ENGLISH,
                                                     SUBLANG_ENGLISH_US ) );
   }
   if ( hLib != NULL )
      FreeLibrary( hLib );

   hLib=NULL;
// NOT OK  но работает в MFC Aplication
if(GetProcAddresses( &hLib, _T("vipdb.dll"), 1, // :confused:
                        &lpfexportedPredicate, "exportedPredicate") )
   {
       lpfexportedPredicate();
       ::MessageBox( 0, _T("Test3"), _T("lpfexportedPredicate"), MB_OK );
   }
   if ( hLib != NULL )
      FreeLibrary( hLib );
    }
} ;

//-----------------------------------------------------------------------------
IMPLEMENT_ARX_ENTRYPOINT(CtestLoadDLLApp)

ACED_ARXCOMMAND_ENTRY_AUTO(CtestLoadDLLApp, AKtestLoadDLL, _vip, vip, ACRX_CMD_TRANSPARENT, NULL)

Вложения
Тип файла: zip TestVipNotOK.zip (5.28 Мб, 66 просмотров)


Последний раз редактировалось alex-63, 12.03.2012 в 16:26.
Просмотров: 4084
 
Непрочитано 11.03.2012, 15:56
#2
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,407
Отправить сообщение для Александр Ривилис с помощью Skype™


1. vipdb.dll где находится? Поробуй задать с полным путём доступа.
2. От каких dll зависит vipdb.dll? Находятся ли они в путях доступа?
3. Одна ли и та же разрядность у arx-файла и vipdb.dll (т.е. x32 или x64)?

Последний раз редактировалось Александр Ривилис, 11.03.2012 в 17:43.
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 12.03.2012, 11:45
#3
alex-63

инженер
 
Регистрация: 15.09.2009
Брест
Сообщений: 55


Данный проект работает в VC++.
Но не загружается из objectArx ?
Не могу понять в чем причина.
Все перепробовал зависимые файлы куда только не переписывал.
Не помогает.
Был бы очень благодарен если бы кто собрал выше указанный код
для AutoCAD у себя. Может причина в системе?
Вложения
Тип файла: zip TestVip.zip (5.90 Мб, 78 просмотров)

Последний раз редактировалось alex-63, 12.03.2012 в 11:58.
alex-63 вне форума  
 
Непрочитано 12.03.2012, 12:43
#4
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,407
Отправить сообщение для Александр Ривилис с помощью Skype™


Ответь сначала на все поставленные вопросы.
При попытке загрузить любую из vip7kernel.dll vip7run.dll vipdb.dll GetLastError возвращает 487 (ERROR_INVALID_ADDRESS).
В чем причина - не знаю и ковырять нет времени. Предполагаю, что без длительной возни заставить работать из arx-файла не получится.

Последний раз редактировалось Александр Ривилис, 12.03.2012 в 13:56.
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 18.03.2012, 23:19
#5
alex-63

инженер
 
Регистрация: 15.09.2009
Брест
Сообщений: 55


Почему то используя вместо LoadLibrary
LoadLibraryEx( lpszLibrary,NULL,DONT_RESOLVE_DLL_REFERENCES ) ) все получилось.
Причем при неявном линковании AutoCAD еще при загрузке
выдавал сообщение AcRxDynamicLinker failed to load acad.exeUnable to load
AKTest.arx file.
alex-63 вне форума  
 
Непрочитано 18.03.2012, 23:45
#6
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,407
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от alex-63 Посмотреть сообщение
Почему то используя вместо LoadLibrary
LoadLibraryEx( lpszLibrary,NULL,DONT_RESOLVE_DLL_REFERENCES ) ) все получилось.
Флаг DONT_RESOLVE_DLL_REFERENCES отвечает в первую очередь за вызов (точнее "не вызов") DLLMain.
Возможно в DLLMain этих dll-ек делается что-то такое, что не всегда допустимо. Тут можно только гадать...
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 05.04.2012, 09:21
#7
alex-63

инженер
 
Регистрация: 15.09.2009
Брест
Сообщений: 55


Похоже что единственное ограничение чтобы DLL подгружаемые в arx были скомпилированы без ключа /BASE.
Спасибо Александр Ривилис за помощь. (это от радости пальцы "кривые" клавиатура маленькая ...)
Проблема решена.

Последний раз редактировалось alex-63, 05.04.2012 в 14:10.
alex-63 вне форума  
 
Непрочитано 05.04.2012, 11:30
#8
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,407
Отправить сообщение для Александр Ривилис с помощью Skype™


Удалено.

Последний раз редактировалось Александр Ривилис, 06.04.2012 в 17:18.
Александр Ривилис вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Есть ли ограничения на LoadLibrary из ObjectArx ?

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Есть ли ограничения по отрыву в сваях в зданиях с тяжелыми кранами? SerStar Основания и фундаменты 4 01.12.2010 16:59
AutoCAD vs Project Studio CS, Есть ли смысл слезать с голого автокада? inwar AutoCAD 5 15.11.2010 08:00
Почему при вставке новой строки в таблицу в кторой есть ссылки на другую таблицу эти ссылки начинают ссылаться на другие ячейки? МишаИнженер AutoCAD 8 09.11.2010 20:24
Есть небольшая работа Sever Прочее. Архитектура и строительство 20 11.04.2010 16:39
Какие есть ограничения на применения групп? Кулик Алексей aka kpblc Программирование 4 24.03.2006 12:41