Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.07.2014, 00:41   #1
korn999
Пользователь
 
Регистрация: 02.07.2014
Сообщений: 22
По умолчанию кто-нибудь работал с командой IMPLIB??

Я сделал тестовую DLL на DELFI int sum(int a, int b) result:=a+b
и нужно загрузить её из Builder 5 (или RAD XE5).
Бьюсь- бьюсь, ничего не выходит! Помогите, пожалуйста!
korn999 вне форума Ответить с цитированием
Старый 02.07.2014, 10:38   #2
FataLL
Форумчанин
 
Аватар для FataLL
 
Регистрация: 29.01.2013
Сообщений: 319
По умолчанию

Динамическая загрузка:
1) Описываешь указатель на функцию
Код:
typedef int (*TSumFunc)(int,int);
TSumFunc pfSum;
2) Грузишь DLL и получаешь адрес функции
Код:
HMODULE hDll = LoadLibrary( "Sum.dll" );
if( hDll == NULL )
{
  // Обработка ошибки
}
pfSum = (TSumFunc) GetProcAddress( hDll, "sum" );
if( pfSum == NULL )
{
  // Обработка ошибки
}
3) Используешь
Код:
int nResult = pfSum( 2, 3 );
Статическая загрузка
1) С помощью IMPLIB создаёшь Sum.lib и подключаешь к проекту
Код:
#pragma comment(lib, "Sum.lib")
2) Описываешь импортируемую функцию
Код:
__declspec(dllimport) int sum( int, int );
3) Юзаешь
Код:
int nResult = sum( 2, 3 );

Последний раз редактировалось Stilet; 02.07.2014 в 16:45.
FataLL вне форума Ответить с цитированием
Старый 02.07.2014, 16:03   #3
korn999
Пользователь
 
Регистрация: 02.07.2014
Сообщений: 22
По умолчанию

Извините, но не получается ни-фи-га! 5 323-ой раз "unresolvd"...
Не могли бы Вы сделать и послать мне исходники на
kornju@mail.ru ?

Меня интересует только статический случай.

или возьмите мои...
http://kornju.hop.ru/make%20DLL.zip
http://kornju.hop.ru/use%20DLL.zip

Последний раз редактировалось Stilet; 02.07.2014 в 16:50.
korn999 вне форума Ответить с цитированием
Старый 02.07.2014, 17:55   #4
FataLL
Форумчанин
 
Аватар для FataLL
 
Регистрация: 29.01.2013
Сообщений: 319
По умолчанию

Два момента. В use DLL
Код:
extern "C" __declspec(dllimport) int _stdcall sum( int, int );
И уже почти счастье. Компиляется, но считает ерунду. Потому что в дельфийском варианте функция считает, что параметры передаются через регистры. Подозреваю, что дело в неправильном описании дельфёвой функции, поэтому, в make DLL [не проверял, дельфей нет]
Код:
function sum(a: Integer; b: Integer) : Integer; stdcall;
FataLL вне форума Ответить с цитированием
Старый 02.07.2014, 19:31   #5
korn999
Пользователь
 
Регистрация: 02.07.2014
Сообщений: 22
По умолчанию БОЛЬШУ-У-У-ЩЕЕ спасибо!!!

Я добавил в DELFI-йскую функцию stdcall и всё заработало как надо! Возвращает 5.
ПОЖАЛУЙСТА, проконтролируйте и мою основную работу.
Я заключил договор на написание интерфейса к прибору. К нему имеется только описание и dll-ка на DELFI: CCDUSBDCOM01.dll
Я буду писать программу на RAD XE5. Сейчас моя задача, чтобы программа проглотила один из трёх вариантов:
HitTest(long); // как в паскалевском примере
ССD_HitTest(long); // как в описании
ССDСОМB_HitTest(long); // как в def файле (сделал impdef-ом)
...
korn999 вне форума Ответить с цитированием
Старый 03.07.2014, 11:22   #6
FataLL
Форумчанин
 
Аватар для FataLL
 
Регистрация: 29.01.2013
Сообщений: 319
По умолчанию

Так, всё по образу и подобию. В чём трудность?
FataLL вне форума Ответить с цитированием
Старый 06.07.2014, 09:55   #7
korn999
Пользователь
 
Регистрация: 02.07.2014
Сообщений: 22
По умолчанию

А вот снова не получается!
Для функций (тестовой) sum, для HitTest, GetSerialNumber - вроде работает(??)
а на ССD_Init - ругается.

Дельфийский вариант берёт, а си-шный нет!

Подскажите, как правильно?

extern "C"
__declspec(dllimport)
//long
//unsigned char
boolean
_stdcall
CCD_Init(HWND ahAppWnd, char* Prm, long ID);
//extern "C" __declspec(dllimport) long _stdcall
// CCD_GetSerialNum(long ID, char* Prm);

/*
function CCD_Init (ahAppWnd : HWND; Prm : PChar; Var ID
: Integer) : boolean; stdcall;
*/



void __fastcall TForm1::Button1Click(TObject *Sender)
{
char* Prm;
long temp=0;
CCD_Init(Application->Handle, Prm, temp);
}


Говорит исключение в CCDUSBDCOM01.dll. Write of adress 0000000. А функции hittest и getserialnum вроде работают. И тестовая sum(a+b) - тоже.


Моя программа
korrn.hop.ru/CC.ZIP
korn999 вне форума Ответить с цитированием
Старый 06.07.2014, 10:28   #8
FataLL
Форумчанин
 
Аватар для FataLL
 
Регистрация: 29.01.2013
Сообщений: 319
По умолчанию

1) Не возможно скачать файл по указанной ссылке.
2) Если программа компилируется, значит функцию линкер находит. Исключение может возникать только в том случае, если аргументы передаются в стек не в том порядке. За порядок передачи аргументов отвечает модификатор stdcall. Попробуй pascal...
FataLL вне форума Ответить с цитированием
Старый 06.07.2014, 10:50   #9
korn999
Пользователь
 
Регистрация: 02.07.2014
Сообщений: 22
По умолчанию

Ну как невозможно?

http://kornju.hop.ru/CC.ZIP
korn999 вне форума Ответить с цитированием
Старый 06.07.2014, 10:51   #10
korn999
Пользователь
 
Регистрация: 02.07.2014
Сообщений: 22
По умолчанию

Действительно? Какая-то ерунда! Сейчас разберусь...
korn999 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Кто нибудь работал с yandex tts? timedo PHP 0 03.06.2013 23:55
Есть кто-нибудь, кто работал с файлами excel на c#? Bi0max Microsoft Office Excel 11 23.08.2012 13:07
не знаю как выполнить.кто-нибудь...ну кто-нибудь... blina Общие вопросы по Java, Java SE, Kotlin 1 12.05.2010 11:43
Кто нибудь работал с Astron SiteManager? Начинающая Софт 2 15.07.2008 17:11