2016-01-10 12 views
1

试图动态链接库时,我得到了一些麻烦。视窗 - 载入库动态C++

我的其他专题,并搜查了维基,发现两个有趣的链接:

然而,当我尝试我的图书馆动态我得到悬而未决链接在我applicationk外,这里的文件:

CriptLib.h:

我的代码个
#ifndef CriptLibH 
#define CriptLibH 

#ifdef CRIPTNSDLL_EXPORTS 
#define CRIPTLIB_API __declspec(dllexport) 
#else 
#define CRIPTLIB_API __declspec(dllimport) 
#endif 

#ifdef __cplusplus 

#include <fmx.h> 
#include <FMX.Dialogs.hpp> 
#include <System.Classes.hpp> 
#include <string.h> 
#include <FMX.Memo.hpp> 

extern "C" { 
#endif 

    CRIPTLIB_API void Cript_BasicoM(String Original, String Chave, TMemo* Memo); 
    CRIPTLIB_API void Cript_BasicoL(String Original, String Chave, TStringList* Lista); 
    CRIPTLIB_API void Cript_BasicoS(String Original, String Chave, String* Linha); 
    CRIPTLIB_API void Decript_BasicoM(String Chave, TMemo* Memo); 
    CRIPTLIB_API void Decript_BasicoL(String Chave, TStringList* Lista); 
    CRIPTLIB_API void Decript_BasicoS(String Original, String Chave, String* Linha); 
    CRIPTLIB_API String VerProg(); 

#ifdef __cplusplus 
} 

namespace CriptLib 
{ 
    class Encriptar 
    { 
    public: 
     static void Subst(String Original, String Chave, TMemo* Memo) { Cript_BasicoM(Original, Chave, Memo); } 
     static void Subst(String Original, String Chave, TStringList* Lista) { Cript_BasicoL(Original, Chave, Lista); } 
     static void Subst(String Original, String Chave, String* Linha) { Cript_BasicoS(Original, Chave, Linha); } 
    }; 

    class Decriptar 
    { 
    public: 
     static void Subst(String Chave, TMemo* Memo) { Decript_BasicoM(Chave, Memo); } 
     static void Subst(String Chave, TStringList* Lista) { Decript_BasicoL(Chave, Lista); } 
     static void Subst(String Original, String Chave, String* Linha) { Decript_BasicoS(Original, Chave, Linha); } 
    }; 

    class Info 
    { 
    public: 
     static String Ver() { return VerProg(); } 
    }; 

} 
#endif 

#endif 

配件:

const wchar_t* library = L"CriptLib.dll"; 
typedef String (*VerInfoS)(); 
// Don't know if the following sentence is necessary once it is already declared in CriptLib.h (But I've also tried with it) 
extern "C" __declspec(dllimport) String VerProg(); 

和负载momment:

HINSTANCE load = LoadLibrary(library); 
    if (load) { 

     VerProgS verified = (VerProgS)GetProcAddress(load, "VerProg"); 
     if (!verified) goto jump; 

     frmAbout->lblExtName->Text = "CriptLib V" + CriptLib::Info::Ver(); 

     jump: 

    } 

那么,事情是......我不wnat我的应用程序依赖这个dll的,但是如果它有dll必须加载,所以我只是没有包含.lib文件到项目中,并评论下面的行。

//#pragma comment (lib, "CriptLib.lib") 

的错误,我已经有了:

[ilink32 Error] Error: Unresolved external '_VerProg' referenced from C:\USERS\USER\DOCUMENTS\PROJECT\WIN32\RELEASE\LOAD.OBJ

因为现在,thaks很多球员。

+0

@CaptainObvlious但我想库动态链接,所以.dll文件我就不会需要运行该程序。 – mauroaraujo

回答

1

既然你不想依赖于VerProg DLL,你不想调用它的任何功能,直接在代码中。为他们删除所有extern。当你想打电话给他们,得到了函数指针与GetProcAddress后,然后需要调用的函数直通该函数指针:

frmAbout->lblExtName->Text = "CriptLib V" + (*verified)(); 

,或者因为你可以调用一个指针直接的函数:

frmAbout->lblExtName->Text = "CriptLib V" + verified(); 

Info::Ver功能应该被删除。你可以将你调用的所有导出打包到一个可以加载DLL一次的类中,并有一个函数来检查DLL是否被找到并加载,然后调用函数指针。

当您直接致电VerProg,链接器将需要解决的象征,所以你创建该DLL的依赖。

+0

谢谢,所以我不能使用类在一个DLL中,如果我想独立? – mauroaraujo

+0

重新构造我以前的问题,如果我不是在运行时加载DLL(并使其独立于它的程序),我不能使用类吗? – mauroaraujo

+0

再次阅读后,我明白了。没有必要再解释。谢谢。 – mauroaraujo