"Daniel Kjøller Skovenborg" <waldeinburg@yahoo.com> wrote
>
> Error: Unresolved external 'CImmMouse::Initialize(void *, void *, unsigned
> long, int)' referenced from MAIN.OBJ
>
> og i lib-filen findes:
>
> 010870 THEADR ?Initialize@CImmMouse@@QAEHPAX0KH@Z
> 010898 COMENT Purge: Yes, List: Yes, Class: 160 (0A0h), SubClass: 1 (01h)
> Dynamic link import (IMPDEF)
> Imported by: ordinal
> Internal Name: ?Initialize@CImmMouse@@QAEHPAX0KH@Z
> Module Name: IFC23.dll
> ordinal: 517
> 0108D0 COMENT Purge: Yes, List: Yes, Class: 251 (0FBh), SubClass: 3 (03h)
> Hint:516
> 0108D9 MODEND
>
> En anden fejl så sådan ud:
>
> Error: Unresolved external '_GUID_Feelit_Sine' referenced from MAIN.OBJ
> Søgning på "Sine" i teksten fra TDump gav ingen resultat.
>
Du må finde ud af hvor den stammer fra
> Resten fejlene var destructore. Eksempel:
>
> Error: Unresolved external 'CImmMouse:
CImmMouse()' referenced from
> MAIN.OBJ
>
> Ingen af søgningerne på @CImmMouse gav et resultat, der kunne være en
> destructor. Står de på en anden måde?
>
Jeg gætter på at den hedder noget med ??1CImmMouse...
> Den første fejl, der spyttes ud fra linkeren, er omkring en destructor.
Kan
> det være, de resterende, som faktisk findes i lib-filen, går galt pga.
det?
>
Nej.
Problemet er at det DLL, du vil anvende er C++ kode skrevet med Microsoft
Visual C++ (eller en binært kompatibel med samme name-mangling - f.eks.
Intel C++), og du prøver at bruge det i et program skrevet med Borland C++.
Det kan man generelt ikke - de er ikke binært kompatible.
Hvis det tidligere er gået godt for dig, er det fordi du har brugt et C
interface.
Du har flere (ikke helt trivielle) muligheder:
* Hvis du har sourcen til DLL'et:
* Oversæt sourcen med Borland C++ - og link den statisk med dit program
* Oversæt sourcen med Borland C++ - og lav et DLL med et andet navn
* Brug funktionaliteten via et C interface (nemt) - hvis det findes
* Brug funktionaliteten via et COM interface (lidt sværere) - hvis det
findes
* Skriv dit program med Microsoft Visual C++ eller Intel C++
Det jeg plejer at gøre, når ovenstående ikke er muligt, er at skrive et
ekstra DLL med Microsoft Visual C++ eller Intel C++, der eksporterer
funktionaliteten som C funktioner.
Oven på det laves et identisk objekt-orienteret interface, som oversættes
med Borland compileren og linkes statisk med programmet.
Altså
------------
| BAR.EXE| <- Oversat med BCC
------------
|
---------------
|C_FOO.DLL| <- Oversat med MSVC
---------------
|
-------------
| FOO.DLL | <- Oversat med MSVC
-------------
hvor FOO.DLL indeholder
class foo
{
public:
foo(int arg1, const char* arg2);
~foo();
int foo_func1(int arg1);
};
C_FOO.DLL indeholder
extern "C"
{
typedef void* foo_handle;
foo_handle create_foo(int arg1, const char* arg2);
destroy_foo(foo_handle* foo_arg);
int foo_foo_func1(foo_handle* foo_arg, int arg1);
}
og BAR.EXE bruger header-filen
class foo
{
public:
foo(int arg1, const char* arg2) :
handle_(create_foo(arg1, arg2)) {}
~foo()
{ destroy_foo(handle_); }
int foo_func1(int arg1)
{ return foo_foo_func1(handle_, arg1); }
private:
foo_handle handle_;
private:
// take care of copy-constructor
// and assignment operator
};
(Ovenstående er _ikke_ oversat og testet!)
PS. Brug kun kompatible datatyper i interface - altså dem som Win32 API også
bruger!
Ikke noget med float, double, og slet ikke klasser som std::vector,
std::string etc.
Venlig hilsen
Mogens Hansen