Witam,
Pracuję w Visual Studio 2013. Po raz pierwszy pracuję z DLL'kami i to dodatkowo napisanymi pod Embarcadero.
Zgodnie z sugestią producenta plik DLL potraktowałem *dumpbin * i lib, aby otrzymać plik LIB.
Wszystkie pliki DEF, DLL, EXP, H, LIB wrzuciłem do jednego katalogu (d:\vb\rcp).
W Visualu, we właściwościach projektu dodałem adres w/w katalogu w pozycje:
-
Configuration Properties -> VC++ -> Incude Directories
-
Configuration Properties -> VC++ -> Library Directories
-
Configuration Properties -> C/C++ -> Additional Include Directories
-
Configuration Properties -> Linker -> General ->Additional Library Directories
a nazwy DLL'ek dodałem do: -
Configuration Properties -> Linker -> Input -> Additional Dependencies
Próbuję skompilować przykładowy program dostarczony od producenta:
#include "d:\vb\rcp\common.h"
//#pragma hdrstop
//---------------------------------------------------------------------------
//#pragma argsused
int main(int argc, char* argv[])
{
SGlobalConfig config;
SVertList verts;
SDepartList departs;
SGroupList groups;
SWorkerList workers;
SWorkerDesc worker;
SMemberFilter filter = { GROUP_FILTER, 1, NULL };
if (argc < 3)
{
printf("\nusage: hierarchy <user> <password>\n"); return 0;
}
if (ConnectToServer(argv[1], argv[2]))
{
// Nazwa zakładu jest polem konfiguracji globalnej
biGetGlobalConfig(&config);
printf("\n%s\n", config.Name);
// Pobierz wydziały
if (biGetDeparts(&departs))
{
for (unsigned int i = 0; i<departs.Items; i++)
{
printf(" %s\n", departs.Data[i].Name);
// Pobierz grupy dla wydziału
if (biGetGroups(&groups, departs.Data[i].Number))
{
for (unsigned int j = 1; j<groups.Items; j++)
{
printf(" %s\n", groups.Data[j].Name);
filter.Filter = &groups.Data[j].Number;
// Pobierz pracowników należących do danej grupy
if (biGetWorkersByMembership(&filter, &workers))
{
for (unsigned int k = 0; k<workers.Items; k++)
{
worker.Number = workers.Data[k];
// Pobierz podstawowy opis pracownika
if (biGetWorkerDesc(&worker))
printf(" %s %s\n", worker.SurName, worker.FirstName);
}
// zwolnij liste
LocalFree(workers.Data);
}
}
// zwolnij liste
LocalFree(groups.Data);
}
}
// zwolnij liste
LocalFree(departs.Data);
}
//------------------------------------------------------------------------------
// To samo dla wydziałow
filter.Kind = VERT_FILTER;
biGetGlobalConfig(&config);
printf("\n%s\n", config.Name);
if (biGetVerts(&verts))
{
for (unsigned int i = 0; i<verts.Items; i++)
{
printf(" %s\n", verts.Data[i].Name);
filter.Filter = &verts.Data[i].Number;
if (biGetWorkersByMembership(&filter, &workers))
{
for (unsigned int k = 0; k<workers.Items; k++)
{
worker.Number = workers.Data[k];
if (biGetWorkerDesc(&worker))
printf(" %s %s\n", worker.SurName, worker.FirstName);
}
LocalFree(workers.Data);
}
}
LocalFree(verts.Data);
}
}
DisconnectFromServer();
return 0;
}
//---------------------------------------------------------------------------
Jedyna zmiana to #include "d:\vb\rcp\common.h" - dodanie katalogu z plikami.
plik common.h
#ifndef commonH
#define commonH
//---------------------------------------------------------------------------
#define BIBIDLL_USE
#include "D:\vb\rcp\bimsg.h"
#include "D:\vb\rcp\bibi10.h"
#include <stdlib.h>
#include <stdio.h>
unsigned int ConnectToServer(char* user, char* password);
void DisconnectFromServer();
void VerboseError();
#endif
plik common.cpp
//---------------------------------------------------------------------------
#pragma hdrstop
#include "common.h"
//---------------------------------------------------------------------------
unsigned int ConnectToServer(char* user, char* password)
{
if(biStartup() != S_OK) printf("Błąd 0x%8X",::GetLastError());
if(!biCreate(CAI_TEST,BA_PEOPLE | BA_HIERARCHY | BA_CONFIG,0)) { VerboseError(); return 0; }
if(!biConnect(NULL)) { VerboseError(); return 0; }
if(!biIsAlreadyLoggedOn())
{
if(!biLogin(user,password))
{
if (::GetLastError() == ERROR_SUCCESS)
printf("Błędna nazwa użytkownika lub hasło!\n");
else // np. nazwa użytkownika (i/lub hasło) za krótka
VerboseError();
return 0;
}
}
return 1;
}
void DisconnectFromServer()
{
biLogout();
biRelease();
}
void VerboseError()
{
char buffer[256];
biFormatMessage(::GetLastError(),buffer,256);
printf(buffer);
}
Pliki bimsg.h oraz bibi10.h są za duże aby je wklejać.
W czasie kompilacji wyskakują mi błędy:
''
Error 1 error LNK2019: unresolved external symbol __imp__biGetWorkerDesc referenced in function _main D:\VB\RCP_v1\RCP_v1\RCP_v1.obj RCP_v1
Error 2 error LNK2019: unresolved external symbol __imp__biGetWorkersByMembership referenced in function _main D:\VB\RCP_v1\RCP_v1\RCP_v1.obj RCP_v1
Error 3 error LNK2019: unresolved external symbol __imp__biGetVerts referenced in function _main D:\VB\RCP_v1\RCP_v1\RCP_v1.obj RCP_v1
Error 4 error LNK2019: unresolved external symbol __imp__biGetDeparts referenced in function _main D:\VB\RCP_v1\RCP_v1\RCP_v1.obj RCP_v1
Error 5 error LNK2019: unresolved external symbol __imp__biGetGroups referenced in function _main D:\VB\RCP_v1\RCP_v1\RCP_v1.obj RCP_v1
Error 6 error LNK2019: unresolved external symbol __imp__biGetGlobalConfig referenced in function _main D:\VB\RCP_v1\RCP_v1\RCP_v1.obj RCP_v1
Error 7 error LNK2019: unresolved external symbol "unsigned int __cdecl ConnectToServer(char *,char *)" (?ConnectToServer@@YAIPAD0@Z) referenced in function _main D:\VB\RCP_v1\RCP_v1\RCP_v1.obj RCP_v1
Error 8 error LNK2019: unresolved external symbol "void __cdecl DisconnectFromServer(void)" (?DisconnectFromServer@@YAXXZ) referenced in function _main D:\VB\RCP_v1\RCP_v1\RCP_v1.obj RCP_v1
Error 9 error LNK1120: 8 unresolved externals D:\VB\RCP_v1\Debug\RCP_v1.exe RCP_v1''
Funkcje: biGetWorkerDesc, biGetWorkersByMembership, biGetVerts, biGetDeparts, biGetGroups, biGetGlobalConfig są zadeklarowane w bibi10.h.
#if defined (BIBIDLL_BUILD)
#define BIBI_DLL __declspec(dllexport)
#else
#if defined (BIBIDLL_USE)
#define BIBI_DLL __declspec(dllimport)
#else
#define BIBI_DLL
#endif
#endif
BIBI_DLL unsigned int biGetWorkerDesc(SWorkerDesc* desc);
BIBI_DLL unsigned int biGetWorkersByMembership(const SMemberFilter* filter, SWorkerList* workers);
BIBI_DLL unsigned int biGetVerts(SVertList* verts);
BIBI_DLL unsigned int biGetDeparts(SDepartList* departs);
BIBI_DLL unsigned int biGetGroups(SGroupList* groups, unsigned short depart);
BIBI_DLL unsigned int biGetGlobalConfig(SGlobalConfig* config);
Funkcje: ConnectToServer, DisconnectFromServer są zadeklarowane w common.h.
Próbowałem kilku rozwiązań, które mi się nasuwały:
-
dodałem pliki H do sekcji Header files.
-
próbowałem konstrukcji:
extern "C" {
#include "D:\vb\rcp\bimsg.h"
#include "D:\vb\rcp\bibi10.h"
}
Niestety, nic to nie dało.
Proszę o pomoc.
Krzysiek