#include "stdafx.h"
#include "libgdi_2.h"
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
LIBGDI_2_API int nLibgdi_2=0;
CChart::CChart() {
CChart::count = 0;
return;
}
int CChart::getCount() {
return CChart::count;
}
Проблема с Импортом класса/функций из DLL
у меня есть DLL написанная в MS VC++ 6, и вот что там внутри (libgdi.cpp):
Код:
и вот h-файл:
Код:
#ifdef LIBGDI_2_EXPORTS
#define LIBGDI_2_API __declspec(dllexport)
#else
#define LIBGDI_2_API __declspec(dllimport)
#endif
class LIBGDI_2_API CChart {
private:
int count;
public:
CChart(void);
int getCount();
};
extern LIBGDI_2_API int nLibgdi_2;
#define LIBGDI_2_API __declspec(dllexport)
#else
#define LIBGDI_2_API __declspec(dllimport)
#endif
class LIBGDI_2_API CChart {
private:
int count;
public:
CChart(void);
int getCount();
};
extern LIBGDI_2_API int nLibgdi_2;
Дамп сделанный с помощью tdump.exe показывает что у меня экспортится класс. переменная, и члены класса....
Проблема: у меня не получается симпортить КЛАСС из этой ДЛЛ в Билдере....
пишу так
Код:
#include "libgdi_2.h";
...
class LIBGDI_2_API CChart;
function Test() {
CChart c; // или вот так тоже пишу CChart * c = new CChart(); ... ровно
}
...
class LIBGDI_2_API CChart;
function Test() {
CChart c; // или вот так тоже пишу CChart * c = new CChart(); ... ровно
}
говорит что Unresolved External CChart::CChart(void).....
вот что делать даже не представляю.... ну понятно что не может зацепить DLL ну..... а как быть?...
PS: LIB файл сделал утилитой implib.exe и включил в проект.... :(
Не может найти реализацию конструктора объекта. Почему - не знаю :(
вот вот вот, и я про то же.... ((((
(*всматривается в толпу с ожиданием и ищущим взглядом...*)
жаль...
(*всматривается в толпу с ожиданием и ищущим взглядом...*)
жаль...[/QUOTE]
Объяви конструктор виртуальным.
спасибо, попробую
если имеется ввиду вот так:
Код:
class LIBGDI_2_API CChart {
private:
int count;
public:
virtual CChart(void);
int getCount();
};
private:
int count;
public:
virtual CChart(void);
int getCount();
};
то не проканало.... при компиляции библиотеки даёт "error C2633: 'CChart' : 'inline' is the only legal storage class for constructors"
без объявления конструктора virtual компилится отлично и на ура(!), утилита tdump.exe, в разделе Export, дает про DLL следующую инфу:
Цитата:
Section: Exports
Flags: 00000000
Time Stamp: 453E42B9 : Tue Oct 24 23:43:37 2006
Major Version: 0000
Minor Version: 0000
Exports from libgdi_2.dll
5 exported name(s), 5 export addresse(s). Ordinal base is 1.
Sorted by Name:
RVA Ord. Hint Name
-------- ---- ---- ----
00001019 1 0000 ??0CChart@@QAE@XZ <- класс
00001014 2 0001 ??4CChart@@QAEAAV0@ABV0@@Z <- конструктор
00001005 3 0002 ?getCount@CChart@@QAEHXZ <- функция getCount
0000100A 4 0003 fnLibgdi_2 <-|
0002D3F0 5 0004 nLibgdi_2 <-| переменная и функция помимо класса в DLL
вот :(
ЗЫ: libgdi_2.h и libgdi_2.lib в проект добавил...
В Вижуал Ц++ 6 все работает, все рисуется (потому как либа собссна и есть для рисования, а это просто для примера было).
Но если все-таки кто-то разберется почему не импортится в Билдер... буду ОЧЕНЬ признателен!
ЗЫ: вопрос остаётся открытым :)
Есть такой очень мощный программный комплекс Total Commander. И у него не менее мощный вьювер. Так вот, к этому вьюверу идёт туева хуча плугинов, которые в совокупности просматривают всё, в том числе и исполняемый код.
Модуль FileInfo (у меня v.2, но есть и новее), не просто выводит все экспортируемые элементы exe, dll, bpl и многих других файлов, но и расшифровывает их, отображая вместо абракадабры полные имена использующих классов и требуемых параметров.
Идеальное средство для проверки своих пакетов на экспортируемость :D.
сказал же, всё экпортируется, и мне довольно удобно пользовать tdump и Depends от M$ ))))) (при условии что всё работает окэй в студии, а в частности в VC++, но не работает в Билдере). Поэтому, Уважаемый el scorpio, утилит мне хватает. Но(!) всё равно, спасибо за совет! На досуге заценю )