VC 使用Dll

雨中的相伴

贡献于2012-03-20

字数:2664 关键词: C/C++开发

通过头文件方式引用.lib 1. 创建静态库工程: 在工程中添加自己的类,和函数。 2. build lib工程,这将生成.lib文件。 3. 建立测试工程,第二步生成的.lib文件拷贝到测测试工程的目录(不是debug目录),然后在工程中应用测.lib文件,如下: 或通过Project/Add to project/file加入.lib。 4. 在测试工程中引入.lib的头文件,这样就可用使用.lib了。 显式加载使用_declspec(dllexport) 的dll 1. 建立Win32 dll 工程, 2. 建立头文件test.h,内容如下: #ifndef _TEST_H_ #define _TEST_H_ extern "C" _declspec(dllexport) bool Echo(char*msg); #endif 然后添加test.cpp文件,内容如下: #include "test.h" #include bool Echo(char*msg) { if (!msg) { return false; } printf("%s",msg); return true; } 3. 建立测试工程,测试代码如下: #include "stdafx.h" #include "wtypes.h" int main(int argc, char* argv[]) { char * strFull = "E:\\SRC\\win32dll_1\\win32dll_3\\Debug\\win32dll_3.dll"; HMODULE hDLL = LoadLibrary(strFull); typedef bool (*Echo)(char*); Echo pfun; pfun = (Echo)GetProcAddress(hDLL, "Echo"); bool result = (*pfun)("hello"); return 0; } 显式加载使用.def定义的dll 1. 同上面1. 2. 不建立.h文件,而是建立和工程名称相同的.def文件。 里面内容如下: LIBRARY win32dll_1 EXPORTS Echo 其中win32dll_1是工程名,Echo是要输出的函数名。之后添加test.cpp文件,内容同上不变。 3. 建立测试工程,同上面3. c++动态加载dll中的类 1. 参考:http://blog.csdn.net/yysdsyl/archive/2008/07/08/2626033.aspx 原文: 实例2:演示类的导出和使用动态加载来调用。 动态dll的类导出:CPPDll2->test.h #pragma  once //#include "boost/shared_ptr.hpp" class Test  { public:  virtual ~Test() {}  virtual void DoIt() =0; }; //extern "C" _declspec(dllexport)  std::auto_ptr CreateTest(); //extern "C" _declspec(dllexport) boost::shared_ptr CreateTest(); extern "C" _declspec(dllexport) Test* CreateTestPtr(); extern "C" _declspec(dllexport) void DeleteTestPtr(Test*); 动态dll的类导出的实现:CPPDll2->test.cpp //test.cpp #include "stdafx.h" #include "Test.h" #include  //#include  //#include "boost/shared_ptr.hpp" class CTest : public Test { public:     virtual void DoIt()    { printf("Should do something\n"); } }; //std::auto_ptr CreateTest() //{ //    return std::auto_ptr(new CTest); //} //boost::shared_ptr CreateTest()  //{  //    return boost::shared_ptr(new CTest);   //} Test* CreateTestPtr() {     return new CTest(); } void DeleteTestPtr(Test* t) {     if(t != NULL)     {         delete t;         t = NULL;     } } 对loadlibrary的分装,可以作为tools: //library.h #pragma once #include  #include  #include  class Library { public:  explicit Library(const wchar_t* name)  {   m_handle = LoadLibrary(name);   assert(m_handle);   if (!m_handle)    throw std::runtime_error(std::string("Could not find library file:"));    }  ~Library()  {   FreeLibrary(m_handle);  }  void* GetProc(const char* name)  {   void* proc = ::GetProcAddress(m_handle, name);   assert(proc);   return proc;  } private:  HMODULE m_handle; }; client的调用: #include "stdafx.h" #include "library.h" #include "../CppDll2/test.h" int _tmain(int argc, _TCHAR* argv[]) {          typedef Test* (*CREATE)();     typedef void (*DEL)(Test*);         Library lib(L"CppDll2.dll");     //std::auto_ptr test = ((std::auto_ptr ) lib.GetProc("CreateTest"));     Test* test = (((CREATE)(lib.GetProc("CreateTestPtr")))());     test->DoIt();     ((DEL)(lib.GetProc("DeleteTestPtr")))(test);     return 0; } 代码:

下载文档,方便阅读与编辑

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 10 金币 [ 分享文档获得金币 ]
0 人已下载

下载文档

相关文档