Поиск:

Ответ в темуСоздание новой темы Создание опроса
> подключение MSVS dll к Builder'09, подключение MSVS dll к Builder'09 
:(
    Опции темы
Alexander06
Дата 22.6.2009, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 28.7.2006

Репутация: нет
Всего: нет



Здравствуйте.
Мне необходимо подключить к проекту С++Builder библиотеку, предназначенную для MS VS.

В dll располагаются драйвера к аппаратуре, имеется lib, dll и h-файлы, предназначенные для Visual Studio.

При подключении lib-файла ругается на COFF.

Попробовал 2 решения:

1. Создание промежуточной lib-библиотеки.

С помощью IMPLIB создал .lib для dll-ки, затем подключил ее к проекту, dll положил рядом в папку проекта.

На несоответствие COFF/OMF больше не ругается, но при линковке выдает ошибку:

Код

[ILINK32 Error] Fatal: Unable to open file '쉷矸矼᰸矹ᰞ矹漳ƒĄ.OBJ'


Насколько я понимаю, это свидетельствует о неподходящей библиотеке.

2. Конвертация lib-файла в совместимый с Builder-ом формат.

Использовал утилиту coff2omf.exe

В результате получился другой lib-файл, несколько меньшего размера(14 против 19 кб). Его подключение к проекту приводит к тем-же результатам

Код

[ILINK32 Error] Fatal: Unable to open file '쉷矸矼᰸矹ᰞ矹漳ƒĄ.OBJ'


Что меня настораживает - lib-файл поставки производителя в 7 раз меньше dll-ки. Значит ли это, что он неполный?

Подскажите пожалуйста, что еще можно попробовать.

Правильно ли я понимаю, что вызов функций с помощью GetProcAdress из исходной (MSVS) dll-ки мне не поможет?
PM MAIL   Вверх
Лапоть
Дата 23.6.2009, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 185
Регистрация: 3.4.2009

Репутация: 1
Всего: 2



Вот тут почитай - http://www.arm9.ru/index.php?book=80&pg=ch16lev1sec7
Цитата(Alexander06 @  22.6.2009,  18:29 Найти цитируемый пост)
Что меня настораживает - lib-файл поставки производителя в 7 раз меньше dll-ки. Значит ли это, что он неполный?
Нет, не значит. Размер LIB-файла не является функцией от размера его DLL-файла.

PM MAIL   Вверх
xvr
Дата 23.6.2009, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата

Правильно ли я понимаю, что вызов функций с помощью GetProcAdress из исходной (MSVS) dll-ки мне не поможет? 
Поможет, но нет никакой гарантии, что dll от MSVC ВООБЩЕ будет работать с exe'ником от Builder'а - у них CRT разная (причем ОЧЕНЬ разная)

PM MAIL   Вверх
Alexander06
Дата 23.6.2009, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 28.7.2006

Репутация: нет
Всего: нет



Я раньше думал, что COFF2OMF делает из lib-файла его аналог с другими вызовами функций.
Заметил, что получаемый lib в 7 раз меньше исходного.

Насчет динамического подключения dll насторожило...это что-же, если у меня только dll на руках, возможно я вообще им не воспользуюсь? Как-то жутковато.

Это сообщение отредактировал(а) Alexander06 - 23.6.2009, 17:47
PM MAIL   Вверх
Alexander06
Дата 24.6.2009, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 28.7.2006

Репутация: нет
Всего: нет



Действую сообразно вышеуказанной(http://www.arm9.ru/index.php?book=80&pg=ch16lev1sec7) ссылке, а так же нескольким другим описаниям

http://bcbjournal.org/articles/vol4/0012/U...6d07e0480124071

http://www.devarticles.com/c/a/Cplusplus/D...ions-Part-II/3/

Последовательность действий следующая:

1. С помощью IMPDEF создаю def-файл для исходной dll.

Вот его фрагмент:

Код

LIBRARY     VTEX1048_32.DLL

EXPORTS
    vtex1048_abort                 @1   ; vtex1048_abort
    vtex1048_append_scanlist       @2   ; vtex1048_append_scanlist
    vtex1048_autoConnectToAll      @3   ; vtex1048_autoConnectToAll
    vtex1048_break_lock            @4   ; vtex1048_break_lock
    vtex1048_check_lock            @5   ; vtex1048_check_lock
    ...


2. Правлю его следующим образом:
Код

LIBRARY     VTEX1048_32.DLL

EXPORTS
    vtex1048_abort = vtex1048_abort                 @1   ; vtex1048_abort
    vtex1048_append_scanlist = vtex1048_append_scanlist       @2   ; vtex1048_append_scanlist
    vtex1048_autoConnectToAll = vtex1048_autoConnectToAll      @3   ; vtex1048_autoConnectToAll
    vtex1048_break_lock = vtex1048_break_lock            @4   ; vtex1048_break_lock
    vtex1048_check_lock = vtex1048_check_lock            @5   ; vtex1048_check_lock
    ...


Подозреваю, что это ничего не меняет, но все равно сделал

3. С помощью IMPLIB, def и dll файлов создаю vtex1048_32.lib
Код

     >IMPLIB vtex1048_32.lib vtex1048_32.def


4. Проверяю экспортируемые функции с помощью TLIB.

получаю файл со следующим содержимым

Код

Publics by module

vtex1048_abort    size = 0
    vtex1048_abort                  

vtex1048_append_scanlist    size = 0
    vtex1048_append_scanlist        

vtex1048_autoConnectToAll    size = 0
    vtex1048_autoConnectToAll       

vtex1048_break_lock    size = 0
    vtex1048_break_lock             

vtex1048_check_lock    size = 0
    vtex1048_check_lock             
       ...


5. Добавляю в проект хедер 

Код

#include "vtex1048.h"


6. Добавляю в проект созданный vtex1048_32.lib
dll лежит рядом с lib-ом
в папке проекта

На этапе линковки выдает прежнее сообщение

Код

[ILINK32 Error] Fatal: Unable to open file '쉷矸矼᰸矹ᰞ矹漳ƒĄ.OBJ'


Даже и не знаю, что еще попробоватьsmile
PM MAIL   Вверх
xvr
Дата 24.6.2009, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



А если #include "vtex1048.h" не делать - все равно ругается 'Unable to open file'?
Кстати, как точно выглядит ругань, а то форум сделал из нее набор китайских иероглифов, мне кажется, что оригинал был не такой  smile 
PM MAIL   Вверх
Alexander06
Дата 24.6.2009, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 28.7.2006

Репутация: нет
Всего: нет



Если я не подключу хедер, то он ругается на вызов неизвестных функций и не компилируется, так как в хедере и функции и все необходимые типы.

Точно эта ругань выглядит как квадратики и в конце, перед ".OBJ" символ, похожий на 'A' smile

Если добавляю директиву

Код

#pragma comment(lib, "vtex1048_32.lib")


то все компилируется и линкуется.

Но при запуске приложение виснет даже не появившись, сразу после загрузки "cc3290mt.dll" (use dynamic RTL - true) или после загрузки "WINMM.dll" (use dynamic RTL - false) .

Это сообщение отредактировал(а) Alexander06 - 24.6.2009, 19:13
PM MAIL   Вверх
xvr
Дата 24.6.2009, 20:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Вот, а я говорил  smile 
Цитата

Поможет, но нет никакой гарантии, что dll от MSVC ВООБЩЕ будет работать с exe'ником от Builder'а - у них CRT разная (причем ОЧЕНЬ разная)

Попробуй загрузить dll динамически (через LoadLibrary)


Это сообщение отредактировал(а) xvr - 24.6.2009, 20:12
PM MAIL   Вверх
Alexander06
Дата 25.6.2009, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 28.7.2006

Репутация: нет
Всего: нет



То есть вы имеете ввиду, что при статическом вызове библиотека цепляет с собой несовместимые с Builder'ом dll, которые вешают borland-программу?
А динамический вызов их затронуть не должен, да?

Честно говоря я несколько в шоке от этих открывающихся перспектив.
Спасибо, попробую к dll-обращаться, но вы ответьте, пожалуйста, верно ли я все понял.
PM MAIL   Вверх
xvr
Дата 25.6.2009, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата(Alexander06 @ 25.6.2009,  11:13)
То есть вы имеете ввиду, что при статическом вызове библиотека цепляет с собой несовместимые с Builder'ом dll, которые вешают borland-программу?

Угу
Цитата

А динамический вызов их затронуть не должен, да?
Затронет тоже. Но вдруг заработает  smile 
Цитата

Честно говоря я несколько в шоке от этих открывающихся перспектив.
Угу, dll от MS с Builder'ом не живут  smile Можно сделать dll в VS которая будет жить с Builder'ом (например COM сервер), но это требует некоторой дисциплины при ее написании


PM MAIL   Вверх
GraNit
Дата 29.7.2014, 09:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 20.10.2007

Репутация: нет
Всего: нет



Здравствуйте, уважаемые господа!

Думаю, что столкнулся с подобной проблемой, только "переподвыперевет" у меня по сложнее.
Суть проблемы:
1. Есть два lib файла работающие с эфемеридами НАСА. Написаны для MSVC
2. Пишу "переходник" на MSVS 2010 в виде dll
3. Прикручиваю к своему проекту на BCB 6.0 (проект уже почти готов, поэтому переделывать его под MSVC очень уж долго). DLL загружаю динамически. 

Проблема: Нужная мне функция вызывается, но параметр, который я ей передаю искажается. Параметр - это указатель на строку. Перерыл уже все что можно, нигде нет ответа. У всех все работает без проблем, только у меня все никак у людей  smile 

Для Alexander06, вот мои потуги с вызовом функции (у меня работает). Может быть вам поможет. Заодно посмотрите, пожалуйста, почему я не получаю FileName в нормальном виде? Буду премного благодарен smile

Это хейдер для DLL-ки MSVC
Код

// Ephe.h
#define MYDLL_API __declspec(dllexport)

#ifdef __cplusplus
//extern "C" {
#endif

#include "include\SpiceUsr.h"

    class MYDLL_API MyEpheFuncs
    {
    public:
        void __stdcall OpenEphe(const char *FileName);
        void __cdecl CloseEphe(ConstSpiceChar *FileName);
        void __cdecl BodyPos(char *space_body, char *mydate, char* Observer, SpiceDouble lat, SpiceDouble lon, SpiceDouble alt, SpiceDouble* res[3]);
        void __cdecl SetObserver(SpiceDouble lat, SpiceDouble lon, SpiceDouble alt, SpiceChar *Observer, SpiceChar *FRAME);
        void __cdecl GetObserver(SpiceChar *Observer, SpiceDouble lat, SpiceDouble lon, SpiceDouble alt, SpiceDouble sslat, SpiceDouble sslon);
    };

//}

#ifdef __cplusplus

#endif



Это код DLL из MSVC
Код

#include "ephe.h"
#include <stdarg.h>
#include <string.h>
#include <math.h>
#include <Windows.h>
#include <io.h>
#include <WinUser.h>
#include <stdio.h>

#pragma comment(lib,"cspice.lib")
#pragma comment(lib,"csupport.lib")

BOOL APIENTRY DllMain(HINSTANCE hinstDLL, DWORD fwdreason, LPVOID lpvReserved)
{
return 1;
}

    void MYDLL_API __stdcall MyEpheFuncs::OpenEphe(const char *FileName)
    {
        // Проверим существование файла
        //if ( _access_s((const char*) FileName,0) == 0 ){
            // Если есть, то откроем
        //    furnsh_c((const char*)FileName);
        //}else{
            // Иначе нужно показать что файл не существует.
            char myMessage[100] = "FileName is: ";
            //int j = sprintf(myMessage,"%s %d","Filename is: ", FileName);
            strcat_s(myMessage,FileName);
            int msgboxID = MessageBoxA(NULL,(LPCSTR) myMessage ,(LPCSTR) "Error", MB_OK);
        //}
        return;
    }


Это def файл. Получил его с помошью impdef.exe
Код

LIBRARY     MYEPHEDLL.DLL

EXPORTS
    ??4MyEpheFuncs@@QAEAAV0@ABV0@@Z @1   ; ??4MyEpheFuncs@@QAEAAV0@ABV0@@Z
    ?BodyPos@MyEpheFuncs@@QAAXPAD00NNNQAPAN@Z @2   ; ?BodyPos@MyEpheFuncs@@QAAXPAD00NNNQAPAN@Z
    ?CloseEphe@MyEpheFuncs@@QAAXPBD@Z @3   ; ?CloseEphe@MyEpheFuncs@@QAAXPBD@Z
    ?GetObserver@MyEpheFuncs@@QAAXPADNNNNN@Z @4   ; ?GetObserver@MyEpheFuncs@@QAAXPADNNNNN@Z
    ?OpenEphe@MyEpheFuncs@@QAGXPBD@Z @5   ; ?OpenEphe@MyEpheFuncs@@QAGXPBD@Z
    ?SetObserver@MyEpheFuncs@@QAAXNNNPAD0@Z @6   ; ?SetObserver@MyEpheFuncs@@QAAXNNNPAD0@Z



Это вызов функции в программе BCB из dll
Код

void __fastcall TForm3::FormCreate(TObject *Sender)
{
        dllhandle = LoadLibrary("MyEpheDll.dll");
        if(!dllhandle){
           ShowMessage("Unable to load DLL file!");
           Close();
        }else{
                typedef void (*pOpenEphe)(const char *FileName);
                pOpenEphe OpenEphe = (pOpenEphe)GetProcAddress(dllhandle,"?OpenEphe@MyEpheFuncs@@QAGXPBD@Z");
                
                if (!OpenEphe){
                        ShowMessage("Unable to get proc address of OpenEphe!");
                        Close();
                }else{
                        
                        OpenEphe("c:\\HOROSCOP_EDITOR\\standart.tm");
                }
                FreeLibrary(dllhandle);
        }
}


P.S.
В BCB получаю сообщение: "FileName is: й)("


Это сообщение отредактировал(а) GraNit - 29.7.2014, 09:51
PM MAIL   Вверх
xvr
Дата 29.7.2014, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Любым не статическим функциям членам класса передается скрытый параметр this. Вы же его не передали. 
PM MAIL   Вверх
GraNit
Дата 29.7.2014, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 20.10.2007

Репутация: нет
Всего: нет



Пожалуйста, по подробнее про этот параметр.
PM MAIL   Вверх
xvr
Дата 29.7.2014, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Ваша функция имеет такой прототип (если вызывать ее как С функцию):
Код

void __stdcall OpenEphe(MyEpheFuncs* this, const char *FileName);
Зачем вы вообще все эти функции завернули в класс MyEpheFuncs ?

PM MAIL   Вверх
GraNit
Дата 30.7.2014, 04:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 20.10.2007

Репутация: нет
Всего: нет



Да это не я smile это MSVS 2010
Когда создавал проект, все само так завернулось smile С MSVS я вообще на ВЫ (да-да с большой буквы)
Спасибо за подсказку, буду пробовать.

Убрал класс и все заработало. Огромное спасибо, однако с классами всеравно придется разбираться, когда-нибудь.

Это сообщение отредактировал(а) GraNit - 30.7.2014, 04:31
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0807 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.