Линковка DLL в проектах Turbo C++ 2006

 

Vale

Сальсолёт

Прошу прощения за тривиальный вопрос, но я всё уже забыл.
Итак - имеем Borland® C++Builder® for Microsoft® Windows™ Version 10.0.2288.42451

А проще - Turbo C++ Explorer 2006. Халявный.

Нужно использовать DLL для работы с файлами, фирмы Molecular Devices.

В тексте программы я включаю ссылку на .h файл с декларациями функций.
В проект - включаю *.lib файл, в формате OMF (конвертированный из COFF, борландовской утилитой) .
Вот фрагмент сообщения утилиты:

COFF to OMF Converter Version 1.0.0.74 Copyright © 1999, 2000 Inprise Corporation

Name Imported Ordinal


----------------
ABFH_CheckSampleIntervals 1350
...
ABF_IsABFFile 140

DLL лежит в папке проекта.

Компилируется, но линкер заявляет -
[Linker Error] Error: Unresolved external 'ABF_IsABFFile' referenced from C:\BCB\PROJECTS\MANAGER340\DEBUG_BUILD\MAINFORM.OBJ

В чем собака порылась?

... вообще, честно говоря, достаточно толковые Борландовские Help-ы превратили в бог знает что... И хочется отдать 100 баксей за C++ Builder 6, ан не берут.

BCB Journal 1
"Не следуй за большинством на зло, и не решай тяжбы, отступая по большинству от правды" (Исх. 23:2)  
Это сообщение редактировалось 26.12.2008 в 11:34
+
-
edit
 

Mishka

модератор
★★★
У тебя к DLL есть ещё LIB файл с тем же именем? Линковать надо LIB файл. Там затычки (stubs), которые загружают DLL и разрешают имена по номерам или именным константам. Если ты такой библиотеки не имеешь, то надо загрузить с помощью вызовва LoadLibrary — http://msdn.microsoft.com/en-us/library/ms684175.aspx — и потом руками либо вызывать через таблицу вызовово, либо описать указатели на ф-ции с соответствующими именами и использовать их.

Поскольку ты получил LIB используя тул от Борланда, то этот же тул должен был сгенерить хедер файл, который и должен содержать константы.
 3.0.53.0.5

Vale

Сальсолёт

import library сгенерировал Борландовским implib-ом непосредственно из DLL. Вставил в проект.
Заголовок - взял стандартный из поставки.

Декларация функции в нем идет как

extern "C"
{
...
BOOL WINAPI ABF_IsABFFile(const char *szFileName, int *pnDataFormat, int *pnError);
...
};

Что непонятно - Axabffio32.lib вроде не вошла в командную строку компоновщика.

.... продолжаю ковыряться...

Оппа! Теперь компилируется, линкуется, но не запускается - Ошибка инициализации приложения (0х0000000005) :D
"Не следуй за большинством на зло, и не решай тяжбы, отступая по большинству от правды" (Исх. 23:2)  
Это сообщение редактировалось 27.12.2008 в 05:13

Mishka

модератор
★★★
Vale> extern "C"
Vale> {
Vale> ...
Vale> BOOL WINAPI ABF_IsABFFile(const char *szFileName, int *pnDataFormat, int *pnError);
Vale> ...
Vale> };

Этого не достаточно, нужно, чтобы те самые stdcall или cdecl были — это разные типы вызовов — первый стек очищается вызываемой процедурой, а второй — вызывающей. WINAPI означает stdcall.

Vale> Что непонятно - Axabffio32.lib вроде не вошла в командную строку компоновщика.
Vale> .... продолжаю ковыряться...

Нужно ручками включать как дополнительную библиотеку. В проект включать не обязательно.

Vale> Оппа! Теперь компилируется, линкуется, но не запускается - Access violation :D

Ну, тут надо смотреть — где и какое. Запросто может быть, что, как раз, разница между stdcall. Ещё надо посмотреть, не надо ли библиотеку инициализировать специальным образом.
 3.0.53.0.5

в начало страницы | новое
 
Поиск
Настройки
Твиттер сайта
Статистика
Рейтинг@Mail.ru