首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

初级DLL有关问题,

2012-02-05 
初级DLL问题,在线等!!我写了一个很简单的DLL,如下:testDLL.h#ifdefTESTDLL_EXPORTS#defineTESTDLL_API__de

初级DLL问题,在线等!!
我写了一个很简单的DLL,如下:
testDLL.h

#ifdef   TESTDLL_EXPORTS
#define   TESTDLL_API   __declspec(dllexport)
#else
#define   TESTDLL_API   __declspec(dllimport)
#endif

//   此类是从   testDLL.dll   导出的
class   TESTDLL_API   CtestDLL   {
public:
CtestDLL();
void   display(char   *   pName);
protected:
char   name[5];

//   TODO:   在此添加您的方法。
};

extern   TESTDLL_API   int   ntestDLL;
TESTDLL_API   int   fntestDLL(void);

//   testDLL.cpp   :   定义   DLL   应用程序的入口点。
//

#include   "stdafx.h "
#include   "testDLL.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;
}

//   这是导出变量的一个示例
TESTDLL_API   int   ntestDLL=0;

//   这是导出函数的一个示例。
TESTDLL_API   int   fntestDLL(void)
{
return   42;
}

//   这是已导出类的构造函数。
//   有关类定义的信息,请参阅   testDLL.h
CtestDLL::CtestDLL()
{  
return;  
}

void   CtestDLL::display(char   *   pName)
{
strcpy(name,pName);
cout   < < "name   =   " < <name;
}
用的VS.NET/VC++/Win32/dll不知道写对没有,编译是通过了的。
我想在VS.NET/VC++/Win32/Console下调试它,请用显示调用和隐示两种方式详细写出来,谢谢

[解决办法]
带有类的话只能 导入lib库调用.
无法显示调用.
因为存在编译器改名因素
[解决办法]
看看这个完整的例子,
包括dll 的编写、导出,以及几种调用方法:
http://www.xiaozhou.net/ReadNews.asp?NewsID=956
[解决办法]
ms只能静态加载
带有类的动态不好弄

#define TESTDLL_API extern "C "__declspec(dllexport)
====
#define TESTDLL_API extern "C "__declspec(dllexport)

用C来命名,因为C++里用NVR技术,可能改变命名
[解决办法]
http://dev.yesky.com/430/2142930.shtml
http://dev.yesky.com/241/2144741.shtml
http://dev.yesky.com/359/2145859.shtml


导出类的话,看看第二个和第三个链接...
更多DLL相关:http://soft.yesky.com/lesson/318/2166818.shtml
[解决办法]
1) 你的代码应该是对的

2)静态调用方式:由编译系统完成对DLL的加载和应用程序结束时DLL卸载的编码(如还有其它程序使用该DLL,则Windows对DLL的应用记录减1,直到所有相关程序都结束对该DLL的使用时才释放它),简单实用,但不够灵活,只能满足一般要求。

隐式的调用:需要把产生动态连接库时产生的.LIB文件加入到应用程序的工程中,想使用DLL中的函数时,只须说明一下。隐式调用不需要调用LoadLibrary()和FreeLibrary()。程序员在建立一个DLL文件时,链接程序会自动生成一个与之对应的LIB导入文件。该文件包含了每一个DLL导出函数的符号名和可选的标识号,但是并不含有实际的代码。LIB文件作为DLL的替代文件被编译到应用程序项目中。当程序员通过静态链接方式编译生成应用程序时,应用程序中的调用函数与LIB文件中导出符号相匹配,这些符号或标识号进入到生成的EXE文件中。LIB文件中也包含了对应的DLL文件名(但不是完全的路径名),链接程序将其存储在EXE文件内部。当应用程序运行过程中需要加载DLL文件时,Windows根据这些信息发现并加载DLL,然后通过符号名或标识号实现对DLL函数的动态链接。所有被应用程序调用的DLL文件都会在应用程序EXE文件加载时被加载在到内存中。可执行程序链接到一个包含DLL输出函数信息的输入库文件(.LIB文件)。操作系统在加载使用可执行程序时加载DLL。可执行程序直接通过函数名调用DLL的输出函数,调用方法和程序内部其他的函数是一样的。




2、动态调用方式:是由编程者用API函数加载和卸载DLL来达到调用DLL的目的,使用上较复杂,但能更加有效地使用内存,是编制大型应用程序时的重要方式。

显式的调用:是指在应用程序中用LoadLibrary或MFC提供的AfxLoadLibrary显式的将自己所做的动态连接库调进来,动态连接库的文件名即是上面两个函数的参数,再用GetProcAddress()获取想要引入的函数。自此,你就可以象使用如同本应用程序自定义的函数一样来调用此引入函数了。在应用程序退出之前,应该用FreeLibrary或MFC提供的AfxFreeLibrary释放动态连接库。直接调用Win32 的LoadLibary函数,并指定DLL的路径作为参数。LoadLibary返回HINSTANCE参数,应用程序在调用GetProcAddress函数时使用这一参数。GetProcAddress函数将符号名或标识号转换为DLL内部的地址。程序员可以决定DLL文件何时加载或不加载,显式链接在运行时决定加载哪个DLL文件。使用DLL的程序在使用之前必须加载(LoadLibrary)加载DLL从而得到一个DLL模块的句柄,然后调用GetProcAddress函数得到输出函数的指针,在退出之前必须卸载DLL(FreeLibrary)。

[解决办法]
LZ可可以看一下我BLOG的文章
blog.sina.com.cn/lidongri
粗略的讲解了这个

热点排行