Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > проблема с dll, скомпилированной в Microsoft VS


Автор: stas87 20.10.2009, 12:58
здравствуйте!
помогите решить проблему.

есть dll-ка, скомпилированная на продукте фирмы Майкрософт(VC++ or .NET)
в dll встрены классы. при обращении из среды разработки от Майкрософта - все работает нормально, все функции срабатывают.
при попытке вызвать те же самые методы из Borland C++ Builder 6.0 вылазит Access Violation, хотя адреса функций в dll-ке получает верные. Ошибка выпадает где то внутри самой библиотеки.
уже неделю мучаюсь, помогите пожалуйста.

Автор: Anikmar 20.10.2009, 14:01
ИМХО. Импортировать из DLL классы занятие нудное, противное и неблагодарное.

Автор: stas87 20.10.2009, 15:43
dll написана сторонней фирмой, исходников естесственно нет((, а борланд выбран из за того, что только на него есть лицензия

Автор: xvr 21.10.2009, 12:31
dll от VS с Borland'ом могут быть не совместимы, даже безо всяких классов (были преценденты). Проблема в разных CRT у основного приложения и DLL. В результате грузятся обе CRT (от MS и Borland'а), после чего они начинают драться из за общих ресурсов (типа stdin, stdout, и пр потроха libc), что обычно заканчивается крахом  smile 

Автор: stas87 21.10.2009, 15:18
ладно, спасибо.
скачал бесплатный компилятор от майкрософта - попробую на нем делать

Автор: Anikmar 21.10.2009, 16:57
Если в параметрах передаются структуры то может быть дело в банальном выравнивании.

Автор: stas87 23.10.2009, 05:42
на бесплатном компиляторе тоже не работает((

может какие особые настройки проетка надо указать?

вот заголовочный файл: 

Код


#ifdef AHM_EXPORTS
#define AHM_API extern "C" __declspec(dllexport)
#else
#define AHM_API extern "C" __declspec(dllimport)
#endif

namespace ahm {

...
    class Unit {
    public:
        ...
    };


    /**
     * The class HardwareModel gives access 
     * to the functionality of the abstract hardware model.
     * It mainly gives access to hardware units.
     *
     */    

    class HardwareModel {
    public:
        typedef enum eClassInfo { VERSION=2 } EClassInfo;
        /**
         *  Request access to a hardware unit.
         *  @param hardware unit locater (for example entry in hardware unit config DB)
         *  @return Unit object or 0 (if not available)
         */
     
        virtual ahm::Unit * getUnit(iop::string locatehw)=0;
        
        /**
         * dispose allocated resources for this hardware model
         * ATTENTION: Use this to free resources, when no longer needed.
         *            After dispose calls to the HardwareModel object may cause crashes.
         */
        virtual void dispose()=0;
        
        /**
        * Retrieve version string of hardware model 
        */        
        virtual iop::string version() = 0;
        
        /*** VERSION 2 ... */

        /** set file name of ahmconfig.xml */
        virtual void setConfigFileName(iop::string szfnConfig) = 0;
        /** set file name of ahmconfig.xml */
        virtual iop::string configFileName() = 0;
    };

....

}; // namespace ahm


/**
 * Published DLL entry point
 * Call this to get the singleton hardware model
 *
 */
AHM_API ahm::HardwareModel *  theHardwareModel();



тут вызывающий код:
Код


ahm::Unit* pRoot;
    HMODULE hLib;

    hLib = LoadLibrary("ahmcore.dll");
    if (hLib) {
        ahm::HardwareModel* (*hmf)(void);
        ahm::HardwareModel* hm;
        (FARPROC &) hmf = GetProcAddress(hLib, "theHardwareModel");
        if (hmf == NULL) return 0;
        hm = (*hmf)();
        if (hm == NULL) return 0;
        pRoot = hm->getUnit("DEMO-DMI6000B");
        if (pRoot != NULL) {
           
        }
    }




в полных майкрософтовских студиях pRoot = hm->getUnit("DEMO-DMI6000B"); возвращает значение, на борланде и VC++ 2008 Express Edition возвращает NULL

Автор: xvr 23.10.2009, 06:43
Тогда только дебагер  smile 

Автор: stas87 23.10.2009, 22:23
дебагер - дело довольно геморойное.. тем более когда отсутствуют исходники длл..((

Автор: Anikmar 24.10.2009, 00:10
Цитата(stas87 @  23.10.2009,  05:42 Найти цитируемый пост)
в полных майкрософтовских студиях pRoot = hm->getUnit("DEMO-DMI6000B"); возвращает значение, на борланде и VC++ 2008 Express Edition возвращает NULL

А вообще что должен возвращать метод? Судя по описанию - пустой виртуальный...

Автор: stas87 28.10.2009, 09:18
метод должен возвращать ссылку на класс, при успешном его выполнеии

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)