VS2005创建自己的DLL库

VS2005创建自己的DLL库
VS2005创建自己的DLL库

1VS2005创建DLL

使用VS2005创建自己的动态链接库,这样就不用看到DLL文件有抵触情感了。

一、打开VS2005软件,创建DLL工程。起名ceshi1.

1)

2)点击下一步,应用程序类型为DLL,空工程。

3)完成,一个新的DLL工程设置完毕,接下来编辑源码添加头文件,命名为ceshi1.h,编辑内容:

#ifndef CESHI1_H

#define CESHI1_H //防止重复定义

#include //头文件引用

#if defined DLL_EXPORT //源文件需引用下一函数

#define DECLDIR__declspec(dllexport)//就是这个

#else

#define DECLDIR __declspec(dllimport)

#endif

extern"C"

{

DECLDIR int add(int a, int b); //函数声明

DECLDIR void function(void);

}

#endif

解释:VC中有两种方式导出DLL文件中的函数

1)使用 __declspec关键字。

2)创建模板定义文件(Module_Definithion File)即.def文件。

在此使用第一种方法:

__declspec(dllexport)作用是导出函数符号到DLL的一个存储类中。在头文

件中定义#define DECLDIR __declspec(dllexport)宏来运行这个函数。

使用条件编译,在源文件中宏定义 #define DLL_EXPORT 来运行这个函数。

//****************************************************************************** 创建源文件 ceshi1.cpp

#include

#define DLL_EXPORT

#include"ceshi1.h"

extern"C"

{

//定义Dll中的所有函数

DECLDIR int add(int a, int b)

{

return a+b;

}

DECLDIR void function(void)

{

std::cout<<"DLL called"<

}

}

编译工程,生成ceshi1.dll文件和ceshi1.lib文件(注:找到工程目录,这两个文件在外面的debug文件夹下)。

二、使用创建好的DLL库文件

创建一个控制台应用程序

1)隐式链接:

连接到.lib文件,首先将ceshi1.h头文件,ceshi1.dll动态库文件,ceshi1.lib

静态库文件放在控制台应用程序工程的目录中,即源文件所在的文件夹里。

添加源文件ceshi2.cpp,编码:

#pragma comment(lib,"ceshi1.lib")//链接.lib文件

#include"ceshi1.h"//包含dll的头文件

#include

int main()

{

function();

std::cout<

getchar();

return 0;

}

//******************************************************************************

2)显式链接

只加载.dll文件,但需用到函数指针和Windows 函数,不需要.lib文件和.h头文件。#include

#include

typedef int (*AddFunc)(int, int);

typedef void (*FunctionFunc)(void);//函数指针

int main()

{

AddFunc _AddFunc;

FunctionFunc _FunctionFunc;

//HINSTANCE实例句柄(即一个历程的入口地址)

HINSTANCE hInstLibrary = LoadLibraryA("ceshi1.dll");

//注意,此时的LoadLibraryA()窄字符集和LoadLibraryW()宽字符集的区别,后有介绍。

if(hInstLibrary == NULL)

{

FreeLibrary(hInstLibrary);//释放DLL获得的内存,若句柄无效}

//获得函数的入口地址,还需类型转换

_AddFunc = (AddFunc)GetProcAddress(hInstLibrary,"add");

_FunctionFunc = (FunctionFunc)GetProcAddress(hInstLibrary,"function");

if(_AddFunc==NULL || _FunctionFunc ==NULL)//确定是否成功。

{

FreeLibrary(hInstLibrary);

}

std::cout<<_AddFunc(25,25)<

_FunctionFunc();

getchar();

FreeLibrary(hInstLibrary);

return 0;

}

//****************************************************************************** Windows 的执行文件可以划分为两种形式:程序和动态连接库(DLLs)。一般程序运行是用.EXE文件,但应用程序有时需要调用存储在DLL 中的函数。

当我们调用Windows 中的API 函数的时候,实际上就是调用存储在DLL 中的函数。

在如下几种情况下,调用DLL 是合理的:

1)不同的程序使用相同的DLL ,这样只需要将DLL 在内存中装载一次,节省了内存的开销。

2)当某些内容需要升级的时候,如果使用DLL 只需要改变DLL 就可以了,而不需要把整个程序都进行变动。

3)由于DLL 是独立于语言的,所以,当不同语言习惯的人共同开发一个大型项目的时候,使用DLL 便于程序系统的交流,当然,Delphi开发的DLL 也可以在诸如Visual BASIC,C++ 等系统中使用。

2C语言创建DLL

只是要在公开的接口函数声明前面加上几个特定的修饰符。

//**********example1.h*********************************************************** #ifndef EXAMPLE1_H

#define EXAMPLE1_H

#define DLLIMPORT __declspec(dllexport)

DLLIMPORT void HelloWorld(void);

#endif

//******example1.c*************************************************************** #include"example1.h"

#include

#include

#include

DLLIMPORT void HelloWorld(void)

{

MessageBox(0,TEXT("Hello World from DLL!\n"),TEXT("Hi"),MB_ICONINFORMATION); }

BOOL APIENTRY DllMain(HINSTANCE hInst,DWORD reason,LPVOID reserved)

{

switch(reason){

case DLL_PROCESS_ATTACH:

break;

case DLL_PROCESS_DETACH:

break;

case DLL_THREAD_ATTACH:

break;

case DLL_THREAD_DETACH:

break;

}

return true;

}

__declspec(dllexport)标志着后面这个函数将成为对外的接口,使用包含在DLL中的函数,必须将其导入,导入操作通过dllimport来完成,dllexport和dllimport都是VC和BC所支持的关键字,但不能被自身格式所使用,通用格式为__declspec(dllexport)和__declspec(dllimport),为了简化,用宏名代替,若程序被编译成C++程序,同时希望C程序亦可使用,需要增加”C”的链接说明,

#define DLLEXPORT extern “C” __declspec(dllexport),就避免了标准C++命名损坏。、、有错。

BOOL APIENTRY DllMain()说明:

1、每个DLL必须有一个入口点,DllMain()是入口函数,负责初始化(initialization)和结束(termination)工作,每当一个新的进程或该进程的新的线程访问DLL时,或者不再使用DLL时,或结束时,都将调用DllMain。但是使用terminate Process或terminate Thread结束进程和线程,不会调用DllMain。

DllMain()函数的原型:

BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_resong_for_call, LPVOID lpreserved) {

switch(ul_reason_for_call){

case DLL_PROCESS_ATTACH:

case DLL_THREAD_ATTACH:

case DLL_PROCESS_DETTACH:

case DLL_THREAD_DETTACH:

}

return true;

}

参数:

hMoudle:是动态库被调用时所传递来的一个指向自己的句柄(实际上,它是指向_DGROUP段的一个选择符);HINSTANCE

ul_reason_for_call:是一个说明动态库被调原因的标志。当进程或线程装入或卸载动态连接库的时候,操作系统调用入口函数,并说明动态连接库被调用的原因。它所有的可能值为:DLL_PROCESS_ATTACH: 进程被调用;

DLL_THREAD_ATTACH: 线程被调用;

DLL_PROCESS_DETACH: 进程被停止;

DLL_THREAD_DETACH: 线程被停止;

lpReserved:是一个被系统所保留的参数。

//问题:如何使用上面的DLL库文件?

资料:

动态链接库调用有两种函数:导出函数(export function)和内部函数(internal function)。导出函数可被其他模块调用,内部函数只在定义的DLL中内部使用。

其他模块使用导出函数的用法:

1)传统方法

在模块定义文件的EXPORT部分指定需要的函数或变量,语法格式如下:

entryname[=internalname] [@ordinal[NONAME]] [DATE] [PRIVATE]

其中:entryname是导出函数或数据被引用的名称。

internalname 同entryname.

@ordinal 表示在输出表中的顺序号

NONAME仅仅在按顺序号输出时被使用,(不使用entryname)

DATA表示输出的是数据项,使用DLL输出数据的程序必须声明该数据项为__declspec(dllimport).

以上各项中,只有entryname是必须的,其他可以省略。

对于“C”函数来说,entryname可以等同于函数名;但是对“C++”函数(成员函数、非成员函数)来说,entryname是修饰名。可以从.map映像文件中得到要输出函数的修饰名,或者使用DUMPBIN /SYMBOLS得到,然后把它们写在.def文件的输出模块。

DUMPBIN是VC提供的一个工具。

如果要输出一个“C++”类,则把要输出的数据和成员的修饰名都写入.def模块定义文件。

2)命令行输出

对链接程序LINK指定/EXPORT命令行参数。

3)使用MFC提供的修饰符号__declspec(dllexport)

在要导出的函数、类、数据的声明前加上__declspec(dllexport) 修饰符,表示导出。

extern “C”使在C++中使用C编译方式,在C++中定义C函数,需加extern “C”关键字,用extern “C”来指明该函数使用C编译方式,导出的C函数可在C代码中调用。

例如:在一个C++文件中,有如下函数

extern “C” {void __declspec(dllexport) __cdecl Test(int var);}

其输出函数名为Test (非C++方式)

MFC提供了一些宏,就有这样的作用。省略#define

AFX_CLASS_IMPORT:__declspec(dllexport)

AFX_API_IMPORT:__declspec(dllexport)

AFX_DATA_IMPORT:__declspec(dllexport)

AFX_CLASS_EXPORT:__declspec(dllexport)

AFX_API_EXPORT:__declspec(dllexport)

AFX_DATA_EXPORT:__declspec(dllexport)

AFX_EXT_CLASS:#ifdef _AFX_EXT

AFX_CLASS_EXPORT

#else

AFX_CLASS_IMPORT

AFX_EXT_API:#ifdef _AFX_EXT

AFX_API_EXPORT

#else

AFX_API_IMPORT

AFX_EXT_DATA:#ifdef _AFX_EXT

AFX_DATA_EXPORT

#else

AFX_DATA_IMPORT

像AFX_EXT_CLASS这样的宏,如果用于DLL应用程序的实现中,则表示输出(因为_AFX_EXT被定义,通常是在编译器的标识参数中指定该选项/D_AFX_EXT);如果用于使用DLL的应用程序中,则表示输入(_AFX_EXT没有定义)。

要输出整个的类,对类使用_declspec(_dllexpot);要输出类的成员函数,则对该函数使用_declspec(_dllexport)。如:

class AFX_EXT_CLASS CTextDoc : public CDocument

{

}

extern "C" AFX_EXT_API void WINAPI InitMYDLL();

这几种方法中,最好采用第三种,方便好用;其次是第一种,如果按顺序号输出,调用效率会高些;最次是第二种。

3动态链接库的实现

一、创建DLL文件

1)使用VS2005创建DLL空工程。

2)新建头文件builder1.h,程序:

//************************************************************************* #ifndef BUILDER1_H

#define BUILDER1_H

#ifdef BUILDER1_DLL

#define DLL_API __declspec(dllexport)

#else

#define DLL_API __declspec(dllimport)

#endif

//注意#endif的位置

extern"C"{ //原样编译

//__stdcall 使非C/C++语言能够调用API

DLL_API int__stdcall Max(int a, int b);

}

#endif

//******************************************************************************

3)新建源文件builder1.cpp

//****************************************************************************** #define BUILDER1_DLL

#include "builder1.h"

DLL_API int __stdcall Max(int a,int b)

{

return a>b ? a:b;

}

//*****************************************************************************

4)用.def文件创建动态链接库build1.dll

a、删除build1工程中的builder1.h文件

b、在builder1.cpp中删除#include ”builder1.h”语句。内容:

int__stdcall Max(int a,int b)

{

return a>b ? a:b;

}

c、向该工程中加入一个文本文件,命名为builder1.def,内容:错误

LIBRARY build1 //标准格式LIBRARY “build1”

EXPORTS

Max @ 1 //注意:一定要有空格,语法的格式

d、编译生出dll文件

二、调用动态链接库DLL

1、隐式调用:

1)创建控制台工程build2

2)将build1.dll, build1.lib, builder1.h拷贝到工程所在目录,(主程序cpp所在的文件夹下)

三个文件必须全要。

3)新建源文件build2.cpp

//***********************************************************************

#include"builder1.h"

#pragma comment(lib,"build1.lib")

#include

int main()

{

int value;

value = Max(100,250);

std::cout << "Value="<

getchar();

return 0;

}

//************************成功************************************************** 2、显式调用

1)建立控制台工程

2)将close1.dll拷贝到工程目录(close1.dll是由.def文件生成)

3)用vc/bin下的Dumpbin.exe的小程序,查看DLL文件(DllDemo.dll)中的函数结构。

4)使用类型定义关键字typedef,定义指向和DLL中相同的函数原型指针。

typedef int(__stdcall *lpMax)(int a, int b); //一定要和dll中头文件声明一致

5)通过LoadLibrary()将DLL加载到当前的应用程序中,并返回当前DLL文件的句柄:

HINSTANCE hDLL; //声明一个DLL文件实例句柄

hDLL = LoadLibrary(close1.dll); //导入动态链接库

6)通过GetProcAddress()函数获得导入到应用程序的函数指针。

lpMax Max;

Max = (lpMax)GetProcAddress(hDll,” Max”);

int value;

value = Max(250, 500);

std::cout <<”Value = ”<< value<

7)函数调用完毕后,使用FreeLibrary(),释放DLL文件

FreeLibrary(hDll);

8)编译生成exe文件。

4C++Builder 创建和使用DLL

一、创建

1)File----New建立一个新的DLL工程,生成一个DLL的工程框架。入口函数:

int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason,

void* lpReserved)

{

return 1;

}

DllEntryPoint()函数为一个入口方法,如果使用者在DLL被系统初始化或者注销时被调用,用来写入对DLL的初始化程序和卸载程序;参数:hinst用来指示DLL的基地址;reason用来指示DLL的调用方式,用于区别多线程单线程对DLL 的调用、创建、卸载DLL;lpReaerved为保留参数;

#pragma argsused

extern "C"{

__declspec(dllexport) int __stdcall test(void); //函数声明

}

int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)

{

return 1;

}

//---------------------------------------------------------------------------

int __stdcall test(void) //函数定义

{

std::cout <<"My first BCB DLL project"<

return 250;

}

//……………………………Make project 生成DLL库文件…………………………………………………………

二、调用DLL

1、静态调用法

控制台应用程序,工程添加输入接口库(import library),在project manager中添加。

//---------------------------------------------------------------------------

#include

#pragma hdrstop

//---------------------------------------------------------------------------

#pragma argsused

extern "C" __declspec(dllimport) int __stdcall test(void); //接口声明

int main(int argc, char* argv[])

{

std::cout <

std::cout<<"first dll"<

getchar();

return 0;

}

//---------------------------------------------------------------------------

注意:

(1)动态链接库调用过程、函数时CALL方式与创建时方式一样不写为__cdecl,其它需要声明。

(2)BCB创建的DLL有对应的输入接口库(import library),如只有DLL而无库时,可用BCB 的implib工具产生:implib xxx.lib xxx.dll;另外可用:tlibxxx.lib,xxx.lst 产生DLL的内部函数列表,许多Windows的未公开技术就是用这种方法发现的。

2、动态调用法

动态调用法要用Windows API 中的LoadLibrary()和GetProcAddress()来调入DLL库,指出库中函数位置,这种方法较常见。先设置Project Options:

Packages标签:去除Builder with runtime packages检查框。(在框下面)Linker标签:去除Use dynamic RTL检查框。右下角

否则创建的DLL需要Runtime packages or Runtime library。

#include

#include

#pragma hdrstop

//---------------------------------------------------------------------------

#pragma argsused

typedef int (__stdcall *TEST)(void);

int main(int argc, char* argv[])

{

HINSTANCE hDll;

hDll = LoadLibrary("Project2.dll");

TEST ddd;

ddd = GetProcAddress(hDll,"test");

std::cout<<"ddd()="<

FreeLibrary(hDll);

getchar();

return 0;

}

//-------------------成功--------------------------------------------------------

1利用VC6.0创建静态链接库

一、创建

New-〉projects-〉Win32 Static Libaray,空的工程。

创建一个.h文件staticLib.h

//************************************************************************ #ifndef _STATIC_LIB_H

#define _STATIC_LIB_H

class staticLibTest{

private:

int m_value;

public:

staticLibTest();

void SetVal(int para=0);

int GetVal();

void Display();

};

#endif

//************************************************************************* 创建对应的cpp文件fighting.cpp

//************************************************************************ #include

#include "staticLib.h"

staticLibTest::staticLibTest()

{

m_value = 8;

}

void staticLibTest::SetVal(int para)

{

m_value = para;

}

int staticLibTest::GetVal()

{

return m_value;

}

void staticLibTest::Display()

{

std::cout <<"output value is: "<

}

//*************************Ctrl+F7编译,F7生成LIB**************************** 二、创建中间层(用外部函数来引用静态对象中的数据(数据由对象公有函数传递))。以便C++类中的成员函数能够在C中被调用(通过中间层),将中间层做成静态库。

新建一个静态链接库工程如上,建好工程wrap后,新建头文件wrap.h

//****************************************************************************** #ifndef WRAP_H

#define WRAP_H

#ifdef __cplusplus

extern "C"{

#endif

void ExtcSetVal(int para);

int ExtcGetVal(void);

void ExtcDisplay(void);

#ifdef __cplusplus

}

#endif

#endif

//****************************************************************************** 对应的.cpp文件wrap.cpp

//***************************************************************************** #include "wrap.h"

#include "staticLib.h"

#pragma comment(lib,"view1.lib");

staticLibTest staticLibObj;

void ExtcSetVal(int para)

{

staticLibObj.SetVal(para);

}

int ExtcGetVal()

{

return staticLibObj.GetVal();

}

void ExtcDisplay()

{

staticLibObj.Display();

}

注意:在编译这个工程之前要把1中的头文件staticLib.h和静态库staticLib.lib拷到当前目录下,编译工程,生成wrap.lib。

三、编写测试工程

新建一个Win32 Console Application工程,test1。新建test.cpp

//***************************************************************************** #include

#include "wrap.h"

#pragma comment(lib,"wrap.lib")

int main()

{

ExtcSetVal(250);

ExtcDisplay();

return 0;

}

//****************************************************************************** 将之前生成的两个静态库staticLib.lib和wrap.lib还有头文件wrap.h拷到当前目录下,

编译运行即可

2MFC 动态链接库

1.制作的步骤:

(1)新建MFC AppWizard(dll)工程,工程名为MFCDll,选择空工程类型。

(2)在生成的MFCDll.cpp文件后面增加下面函数代码:

int sum(int a, int b)

{

return a+b;

}

(3)在生成的MFCDll.def文件后面增加如下:

sum @1 ;表示第一个函数是sum

(4)编译后会产生两个文件MFCDll.lib,MFCDll.dll

2、调用

(1)隐式调用法:将MFCDll.lib拷贝到需要应用该DLL的工程的目录下,将MyDll.dll 拷贝到产生的应用程序的目录下,并在需要应用该DLL中的函数的CPP文件中添加如下几行://注意这里没有在MFCDll.h中声明函数,所以不能直接包含MFCDll.h来声明函数。

以下是引用片段:

#pragma comment(lib,"MFCDll");

int sum(int a, int b);

//当然如果你的DLL中有很多函数,那可以另外写个MFCDll.h,包含所有的函数声明,然后直接将头文件包含进去

(2)显示调用法:与Win32的调用方法一样,不需要#pragma comment(lib,"MFCDll");,但是需要在Project->Setting->Link->Object/library modules的框中增加MFCDll.lib这个库。(研究中)

************************************************************************** DLL(Dynamic Linkable Library)可以看成一些可以直接拿来用的变量、函数或类的集合。在库的发展史上经历了“无库-静态链接库-动态链接库”的时代。

静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib中的指令都被直接包含在最终生成的EXE文件中了。但是若使用DLL,该DLL不必被包含在最终EXE文件中,EXE文件执行时可以“动态”地引用和卸载这个与EXE独立的DLL 文件。静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。

对动态链接库,我们还需建立如下概念:

(1)DLL 的编制与具体的编程语言及编译器无关

只要遵循约定的DLL接口规范和调用方式,用各种语言编写的DLL都可以相互调用。譬如Windows提供的系统DLL(其中包括了Windows的API),在任何开发环境中都能被调用,不在乎其是Visual Basic、Visual C++还是Delphi。

(2)动态链接库随处可见

我们在Windows目录下的system32文件夹中会看到kernel32.dll、user32.dll和gdi32.dll,windows的大多数API都包含在这些DLL中。kernel32.dll中的函数主要处理内存管理和进程调度;user32.dll中的函数主要控制用户界面;gdi32.dll中的函数则负责图形方面的操作。

一般的程序员都用过类似MessageBox的函数,其实它就包含在user32.dll这个动态链接库中。由此可见DLL对我们来说其实并不陌生。

(3)VC动态链接库的分类

Visual C++支持三种DLL,它们分别是Non-MFC DLL(非MFC动态库)、MFC Regular DLL (MFC规则DLL)、MFC Extension DLL(MFC扩展DLL)。

非MFC动态库不采用MFC类库结构,其导出函数为标准的C接口,能被非MFC或MFC编写的应用程序所调用;MFC规则DLL 包含一个继承自CWinApp的类,但其无消息循环;MFC 扩展DLL采用MFC的动态链接版本创建,它只能被用MFC类库所编写的应用程序所调用。

隐式调用的方法比较方便,但DLL改变后,应用程序须从新编译。并且,所有所调用的DLL在应用程序加载的同时被加载到内存中,当应用程序调用的DLL比较多时,装入的过程十分慢。显式调用则比较灵活,但比较麻烦.

静态链接MFC DLL和共享MFC DLL的区别:静态链接把程序中要用的在MFC DLL里的东西全部编译到创建的DLL中,体积会大一点,但可以在没有装MFC的机器上运行;通过共享创建的DLL体积小,但在没有安装MFC的机器上有可能不能运行,因为没有相应的库。

直放站最常见故障及处理方法

直放站最常见故障及处理方法 1、直放站轮询失败 拨打监控电话是否可以打通,通的话重新轮询确定是否已恢复正常,不正常则去现场处理。 首先检查设备供电是否正常,检查电源模块工作是否正常,检查监控板工作是否正常,取出监控卡清除卡内短信,确认卡是否停机或损坏,还是不行检查软件设置参数是否正确,如短信中心号码设置是否正确等,没有问题检查MODEM接收信号是否正常,最后都不行就更换MODEM和监控板。 2、下行驻波告警 首先用驻波仪检查直放站输出口主干馈线是否驻波过高,检查线路接头是否进水或被破坏,查出故障点整改后可以恢复,天馈驻波正常则调整直放站设备驻波告警参考值设置是否正确,或者降低直放站的输出功率可以得到解决。 3、下行欠功率告警 首先检查直放站参数设置是否正确,调整增益是否可以恢复,如果数据正常,检查下行低噪放和功放,或是施主信号变小,还有可能施主基站频点更改直放站没有及时更新。 4、直放站覆盖区无信号 `查施主天线是否有故障,检查分布系统是否被破坏。 5、直放站信号变弱 电脑检查输出信号是否变小,参数设置是否改变,调整增益是否可以改善,检查分布系统是否驻波太高。 6、基站有上行干扰 上行底噪大,主要是直放站离基站较近,增益太大。通过减小上行增益可以使底噪下降。还有检查直放站的杂散是否超标。 7、光收发模块故障 首先检查光模块光输出是否正常,再检查光输入是否正常,如果出现LD ALARM则光模块发有故障,更换,如果出现PD ALARM有可能是另一端的光模块出现故障,也可能是光纤线路出现故障,需检查远端的输出是否正常判断故障出现在哪里。 8、覆盖区手机上线困难,呼不出 出现手机上线困难主要原因是上下行增益设置不平衡,手机发射功率大,接入网络困难,接入网络时间长,要求上下行增益差不超过3-5dB。如果设置正确那就可能是上行低噪放和攻放故障,还有个可能是施主基站话务量太大导致上线,电话打不出。 9、效果监控轮询失败 效果监控软件故障,重启设备就可以恢复,效果监控供电故障,或者效果监控卡出现停机等现象。也有可能效果监控硬件故障,比如卡槽坏等明显故障。 10、效果监控接收电平强度告警 首先检查直放站工作是否正常,再检查耦合器和连接线是否有故障,还有检查平台告警范围设置是否合适。 11、切换失败掉话 进出电梯发生切换失败掉话,原因是小区列表没有做好导致掉话,检查电梯厅信号和电梯内信号两个小区的领区列表。直放站选信源要选用原大楼内的主导频点作为信源覆盖,尽量减少切换。 12、微蜂窝信号泄露 室内分布低层天线安装太靠边或者是大楼外墙损耗较小导致室内微蜂窝信号泄露,处理方法;更改室内分布系统器件或主机输出降低天线输出电平,更改天线位置,更换成定向天线,修改微蜂窝和室外宏蜂窝信号切换电平差等。 13、大楼高层信号显示满格,但经常掉话,通话质量差

静态链接库lib和动态链接库dll区别

1.什么是静态连接库,什么是动态链接库 静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib 中的指令都全部被直接包含在最终生成的EXE 文件中了。但是若使用DLL,该DLL 不必被包含在最终EXE 文件中,EXE 文件执行时可以“动态”地引用和卸载这个与EXE 独立的DLL 文件。静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。静态链接库与静态链接库调用规则总体比较如下。 对于静态链接库(比较简单): 首先,静态链接库的使用需要库的开发者提供生成库的.h头文件和.lib文件。 生成库的.h头文件中的声明格式如下: extern "C" 函数返回类型函数名(参数表); 在调用程序的.cpp源代码文件中如下: #include "..\lib.h" #pragma comment(lib,"..\\debug\\libTest.lib") //指定与静态库一起链接 第二,因为静态链接库是将全部指令都包含入调用程序生成的EXE文件中。因此如果用的是静态链接库,那么也就不存在“导出某个函数提供给用户使用”的情况,要想用就得全要!要不就都别要!:) 对于动态链接库: 动态链接库的使用,根据不同的调用方法,需要提供不同的资源: 1. 静态加载------程序静态编译的时候就静态导入dll,这样的话就需要提供给库 使用者(C客户)如下文件:*.lib文件和.dll文件和*.h。其有2个坏处: 1 程序一开始运行就需要载入整个dll,无法载入程序就不能开始运行; 2 由于载入的是整个dll,需要耗费资源较多 其调用方法如下: #include "..\lib.h" #pragma comment(lib,"..\\debug\\libTest.lib") 但是这种方式的话可以调用Class method. 2.动态加载-----那么只需要提供dll文件。 因此调用程序若想调用DLL中的某个函数就要以某种形式或方式指明它到底想调用哪一个函数。但是无法调用Class method了。 如果要调用Dll中的function,需要经历3个步骤: Handle h=LoadLibrary(dllName) --> GetProcAddress(h,functionName) 返回函数指针,通过函指针调用其function-->FreeLibrary(h) 例如:Another.dll有一个int Add(int x,int y)函数。则完整的调用过程如下:

C C++动态链接库的创建与调用

C/C++中动态链接库的创建和调用 1.动态链接库的创建步骤: 创建Non-MFC DLL动态链接库 1.打开File —> New —> Project选项,选择Win32 Dynamic-Link Library —>sample project —>工程名:DllDemo 2.新建一个.h文件DllDemo.h 并添加如下代码: #ifdef DllDemo_EXPORTS #define DllAPI _declspec(dllexport) #else #define DllAPI _declspec(dllimport) extern “C” // 原样编译 { DllAPI int _stdcall Max(int a,int b); //_stdcall使非C/C++语言内能够调用API } #endif 3.新建一个.cpp文件,并添加如下代码 #include "DllDemo.h" DllAPI int __stdcall Max(int a,int b) { if(a==b) return NULL; else if(a>b) return a; else return b; } 4.编译程序生成动态链接库 1.2 用.def文件创建动态连接库DllDemo.dll 1、删除DllDemo工程中的DllDemo.h文件。 2、在DllDemo.cpp文件头,删除#include DllDemo.h语句。 3、向该工程中加入一个文本文件,命名为DllDemo.def并写入如下语句: LIBRARY MyDll EXPORTS Max@1 4、编译程序生成动态连接库。 2.动态链接库的调用步骤 2.1 隐式调用 1.建立DllCnsTest工程 2.将文件DllDemo.dll、DllDemo.lib拷贝到DllCnsTest工程所在的目录 3.在DllCnsTest中添加如下语句: #define DllAPI _declspec(dllimport) #pragma comment(lib,”DllDemo.lib”) extern “C” { DllAPI int _stdcall Max(int a,int b);

lib和dll文件的区别和联系

(1)lib是编译时需要的,dll是运行时需要的。 如果要完成源代码的编译,有lib就够了。 如果也使动态连接的程序运行起来,有dll就够了。 在开发和调试阶段,当然最好都有。 (2)一般的动态库程序有lib文件和dll文件。lib文件是必须在编译期就连接到应用程序中的,而dll文件是运行期才会被调用的。如果有dll文件,那么对应的lib文件一般是一些索引信息,具体的实现在dll文件中。如果只有lib文件,那么这个lib文件是静态编译出来的,索引和实现都在其中。静态编译的lib文件有好处:给用户安装时就不需要再挂动态库了。但也有缺点,就是导致应用程序比较大,而且失去了动态库的灵活性,在版本升级时,同时要发布新的应用程序才行。 (3)在动态库的情况下,有两个文件,一个是引入库(.LIB)文件,一个是DLL文件,引入库文件包含被DLL导出的函数的名称和位置,DLL包含实际的函数和数据,应用程序使用LIB文件链接到所需要使用的DLL文件,库中的函数和数据并不复制到可执行文件中,因此在应用程序的可执行文件中,存放的不是被调用的函数代码,而是DLL中所要调用的函数的内存地址,这样当一个或多个应用程序运行是再把程序代码和被调用的函数代码链接起来,从而节省了内存资源。从上面的说明可以看出,DLL和.LIB文件必须随应用程序一起发行,否则应用程序将会产生错误。 一、开发和使用dll需注意三种文件 1、 dll头文件 它是指dll中说明输出的类或符号原型或数据结构的.h文件。当其它应用程序调用dll时,需要将该文件包含入应用程序的源文件中。 2、 dll的引入库文件 它是dll在编译、链接成功后生成的文件。主要作用是当其它应用程序调用dll时,需要将该文件引入应用程序。否则,dll无法引入。 3、 dll文件(.dll) 它是应用程序调用dll运行时,真正的可执行文件。dll应用在编译、链接成功后,.dll文件即存在。开发成功后的应用程序在发布时,只需要有.exe文件和.dll文件,不必有.lib文件和dll头文件。 动态链接库 (DLL) 是作为共享函数库的可执行文件。动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。函数的可执行代码位于一个 DLL 中,该 DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。DLL 还有助于共享数据和资源。多个应用程序可同时访问内存中单个 DLL 副本的内容。 动态链接与静态链接的不同之处在于:动态链接允许可执行模块(.dll 文件或 .exe 文件)仅包含在运行时定位 DLL 函数的可执行代码所需的信息。在静态链接中,链接器从静态链接库获取所有被引用的函数,并将库同代码一起放到可执行文件中。 使用动态链接代替静态链接有若干优点。DLL 节省内存,减少交换操作,节省磁盘空间,更易于升级,提供售后支持,提供扩展 MFC 库类的机制,支持多语言程序,并使国际版本的创建轻松完成。 lib与dll文件最大区别在调用方面 dll可以静态陷入 lib与DLL 从这一章起,我讲述的内容将特定于windows平台。其实这篇文章也可看作是我在windows下的开发经验总结,因为以后我决定转unix了。 前面有一章说编译与链接的,说得很简略,其实应该放到这一章一块儿来说的。许多单讲

VC++动态链接库创建和调用全过程详解

1.概论 先来阐述一下DLL(Dynamic Linkable Library)的概念,你可以简单的把DLL看成一种仓库,它提供给你一些可以直接拿来用的变量、函数或类。在仓库的发展史上经历了“无库-静态链接库-动态链接库”的时代。 静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib中的指令都被直接包含在最终生成的EXE文件中了。但是若使用DLL,该DLL不必被包含在最终EXE文件中,EXE文件执行时可以“动态”地引用和卸载这个与EXE独立的DLL文件。静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。 对动态链接库,我们还需建立如下概念: (1)DLL 的编制与具体的编程语言及编译器无关 只要遵循约定的DLL接口规范和调用方式,用各种语言编写的DLL都可以相互调用。譬如Windows提供的系统DLL(其中包括了Windows的API),在任何开发环境中都能被调用,不在乎其是Visual Basic、Visual C++还是Delphi。 (2)动态链接库随处可见 我们在Windows目录下的system32文件夹中会看到kernel32.dll、user32.dll和gdi32.dll,windows的大多数API都包含在这些DLL中。kernel32.dll中的函数主要处理内存管理和进程调度;user32.dll中的函数主要控制用户界面;gdi32.dll中的函数则负责图形方面的操作。 一般的程序员都用过类似MessageBox的函数,其实它就包含在user32.dll这个动态链接库中。由此可见DLL对我们来说其实并不陌生。 (3)VC动态链接库的分类 Visual C++支持三种DLL,它们分别是Non-MFC DLL(非MFC动态库)、MFC Regular DLL(MFC规则DLL)、MFC Extension DLL(MFC扩展DLL)。 非MFC动态库不采用MFC类库结构,其导出函数为标准的C接口,能被非MFC或MFC编写的应用程序所调用;MFC规则DLL 包含一个继承自CWinApp的类,但其无消息循环;MFC扩展DLL采用MFC的动态链接版本创建,它只能被用MFC类库所编写的应用程序所调用。 由于本文篇幅较长,内容较多,势必需要先对阅读本文的有关事项进行说明,下面以问答形式给出。 问:本文主要讲解什么内容? 答:本文详细介绍了DLL编程的方方面面,努力学完本文应可以对DLL有较全面的掌握,并能编写大多数DLL程序。 问:如何看本文? 答:本文每一个主题的讲解都附带了源代码例程,可以随文下载(每个工程都经WINRAR压缩)。所有这些例程都由笔者编写并在VC++6.0中调试通过。

通信直放站故障处理

通信直放站故障处理 随着近年来通信无线市场的需求和传输技术的革新,促使通信无线设备越来越集成化、人性化、功能化。无线通信领域各种技术的互补性日趋鲜明。这主要表现在不同的接入技术具有不同的覆盖范围、不同的适用区域、不同的技术特点和不同的接入速率。铁路通信应用较广的模式有直放站传输模式,研究其使用和维护,总结日常出现的故障克服更有利于日后维护和设备的稳定使用。 标签:直放站;开通;故障;解决 前言 无线通信技术近十年的变更非常瞩目,我国无线频率资源也较为丰富,推進不同技术相关频谱的规划和应用工作是现在政府和各个行业应该推进的工作之一。比如3G/4G可解决广域网的传输需求;WLAN可解决中距离的较高速传输;UWB超宽带可解决近距离的超高速无线传输。因此在组网上要考虑一体化,多技术并用的方式实现不同用户群体的需求。未来的无线通信网络将是一个综合的一体化的解决方案,各种无线技术都将在这个一体化的网络中发挥自己的作用。有线传输与无线传输的结合,长距离与短距离或超短距离的高速传输的结合,满足不同行业、不同群体的需求为出发点的革新。 在铁路无线通信网络中,无线直放站的组网方式以其结构简单、安装方便、设备稳定性强、覆盖面积满足铁路通信的要求等特点,被铁路通信专业广为使用,其安装较基站便利,建设周期较短,并且不受各方面的的限制等优点,在各个管辖线路中广泛使用。针对直放站使用中的一些常见障碍和解决方式做个归纳和分析。 1 直放站简介 铁路无线直放站主要是由近端机、远端机、连接光纤、耦合器等设备构成。 车站信号通过耦合器耦合,进入近端机,经过光电转换,传输至光缆,远端机接收到光信号后,转换为电信号,并进行放大,通过天线向外覆盖,传输到隧道内的移动机车,使处于隧道内的机车台和手持台有较好的接收效果,同时将机车发出的反向信号通过天线接收并放大后,由光缆发回近端机,再由近端机转换后传回车站电台。实现车站与隧道内的机车之间的异频半双工通讯。 2 安装调试 设备在投入运营前做好安装和调试工作,确保设备的稳定运行,一般安装近端机、远端机较为简单,大多都是成品根据图纸组网,较为简单。调试工作做好以下几个方面。

VC++ MFC DLL动态链接库编写详解

VC++ MFC DLL动态链接库编写详解(2008-07-10 17:38:40) 标签:it分类:com技术然能用DLL实现的功能都可以用COM来替代,但DLL的优点确实不少,它更容易创建。本文将讨论如何利用VC MFC来创建不同类型的DLL,以及如何使用他们。 一、DLL的不同类型 使用VC++可以生成两种类型的DLL:MFC扩展DLL和常规DLL。常规DLL有可以分为动态连接和静态连接。Visual C++还可以生成WIN32 DLL,但不是这里讨论的主要对象。 1、MFC扩展DLL 每个DLL都有某种类型的接口:变量、指针、函数、客户程序访问的类。它们的作用是让客户程序使用DLL,MFC扩展DLL可以有C++的接口。也就是它可以导出C++类给客户端。导出的函数可以使用C++/MFC数据类型做参数或返回值,导出一个类时客户端能创建类对象或者派生这个类。同时,在DLL中也可以使用DLL和MFC。 Visual C++使用的MFC类库也是保存在一个DLL中,MFC扩展DLL动态连接到MFC代码库的DLL,客户程序也必须要动态连接到MFC代码库的DLL。(这里谈到的两个DLL,一个是我们自己编写的DLL,一个装MFC类库的DLL)现在MFC代码库的DLL也存在多个版本,客户程序和扩展DLL都必须使用相同版本的MFC代码DLL。所以为了让MFC扩展DLL能很好的工作,扩展DLL和客户程序都必须动态连接到MFC代码库DLL。而这个DLL必须在客户程序运行的计算机上。 2、常规DLL 使用MFC扩展DLL的一个问题就是DLL仅能和MFC客户程序一起工作,如果需要一个使用更广泛的DLL,最好采用常规DLL,因为它不受MFC的某些限制。常规DLL也有缺点:它不能和客户程序发送指针或MFC派生类和对象的引用。一句话就是常规DLL和客户程序的接口不能使用MFC,但在DLL和客户程序的内部还是可以使用MFC。 当在常规DLL的内部使用MFC代码库的DLL时,可以是动态连接/静态连接。如果是动态连接,也就是常规DLL需要的MFC代码没有构建到DLL中,这种情况有点和扩展DLL类似,在DLL运行的计算机上必须要MFC代码库的DLL。如果是静态连接,常规DLL里面已经包含了需要的MFC代码,这样DLL的体积将比较大,但它可以在没有MFC代码库DLL的计算机上正常运行。 二、建立DLL 利用Visual C++提供的向导功能可以很容易建立一个不完成任何实质任务的DLL,这里就不多讲了,主要的任务是如何给DLL添加功能,以及在客户程序中利用这个DLL 1、导出类 用向导建立好框架后,就可以添加需要导出类的.cpp .h文件到DLL中来,或者用向导创建C++ Herder File/C++ Source File。为了能导出这个类,在类声明的时候要加“_declspe c(dllexport)”,如:

VC++动态链接库(DLL)编程深入浅出

VC++动态链接库(DLL)编程深入浅出 作者:宋宝华 联系作者:e-mail:21cnbao@https://www.360docs.net/doc/429425954.html, 出处:Pconline 由于本文篇幅较长,内容较多,势必需要先对阅读本文的有关事项进行说明,下面以问答形式给出。 问:本文主要讲解什么内容? 答:本文详细介绍了DLL编程的方方面面,努力学完本文应可以对DLL有较全面的掌握,并能编写大多数DLL程序。 问:如何看本文? 答:本文每一个主题的讲解都附带了源代码例程,可以随文下载(每个工程都经WINRAR压缩)。所有这些例程都由笔者编写并在VC++6.0中调试通过。 当然看懂本文不是读者的最终目的,读者应亲自动手实践才能真正掌握DLL的奥妙。 问:学习本文需要什么样的基础知识? 答:如果你掌握了C,并大致掌握了C++,了解一点MFC的知识,就可以轻松地看懂本文。 目录 1、概论 2、静态链接库 3、库的调试与查看 4、非MFC DLL 5、MFC规则DLL 6、MFC扩展DLL的创建

1.概论 先来阐述一下DLL(Dynamic Linkable Library)的概念,你可以简单的把DLL看成一种仓库,它提供给你一些可以直接拿来用的变量、函数或类。在仓库的发展史上经历了“无库-静态链接库-动态链接库”的时代。 静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib中的指令都被直接包含在最终生成的EXE文件中了。但是若使用DLL,该DLL不必被包含在最终EXE文件中,EXE文件执行时可以“动态”地引用和卸载这个与EXE独立的DLL文件。静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。 对动态链接库,我们还需建立如下概念: (1)DLL 的编制与具体的编程语言及编译器无关 只要遵循约定的DLL接口规范和调用方式,用各种语言编写的DLL都可以相互调用。譬如Windows提供的系统DLL(其中包括了Windows的API),在任何开发环境中都能被调用,不在乎其是Visual Basic、Visual C++还是Delphi。 (2)动态链接库随处可见 我们在Windows目录下的system32文件夹中会看到kernel32.dll、user32.dll和gdi32.dll,windows的大多数API都包含在这些DLL中。kernel32.dll中的函数主要处理内存管理和进程调度;user32.dll中的函数主要控制用户界面;gdi32.dll中的函数则负责图形方面的操作。 一般的程序员都用过类似MessageBox的函数,其实它就包含在user32.dll这个动态链接库中。由此可见DLL对我们来说其实并不陌生。 (3)VC动态链接库的分类 Visual C++支持三种DLL,它们分别是Non-MFC DLL(非MFC动态库)、MFC Regular DLL(MFC规则DLL)、MFC Extension DLL(MFC扩展DLL)。 非MFC动态库不采用MFC类库结构,其导出函数为标准的C接口,能被非MFC或MFC编写的应用程序所调用;MFC规则DLL 包含一个继承自CWinApp的类,但其无消息循环;MFC扩展DLL采用MFC的动态链接版本创建,它只能被用MFC类库所编写的应用程序所调用。

演练:创建和使用动态链接库 (C++)

Visual C++ 指导教程 演练:创建和使用动态链接库(C++) Visual Studio 2010 其他版本 0(共1)对本文的评价是有帮助评价此主题 我们将创建的第一种类型的库是动态链接库(DLL)。使用DLL 是一种重用代码的绝佳方式。您不必在自己创建的每个程序中重新实现同一例程,而只需对这些例程编写一次,然后从需要该功能的应用程序引用它们即可。 本演练涵盖以下内容: ?创建新的动态链接库(DLL) 项目。 ?向动态链接库添加类。 ?创建引用动态链接库的应用程序。 ?在控制台应用程序中使用类库的功能。 ?运行应用程序。 系统必备 本主题假定您具备C++ 语言的基础知识。如果您是刚开始学习C++,建议您参阅Herb Schildt 编写的“C++ Beginner's Guide”(《C++ 初学者指南》),该书可从 https://www.360docs.net/doc/429425954.html,/fwlink/?LinkId=115303在线获得。 创建新的动态链接库(DLL) 项目 1.从“文件”菜单中,选择“新建”,然后选择“项目…”。 2.在“项目类型”窗格中,选择“Visual C++”下的“Win32”。 3.在“模板”窗格中,选择“Win32 控制台应用程序”。 4.为项目选择一个名称,如MathFuncsDll,并将其键入“名称”字段。为解决方案选择一个名 称,如DynamicLibrary,并将其键入“解决方案名称”字段。 5.单击“确定”启动Win32 应用程序向导。在“Win32 应用程序向导”对话框的“概述”页中, 单击“下一步”。

6.在“Win32 应用程序向导”中的“应用程序设置”页中,选择“应用程序类型”下的“DLL”(如果 可用),或者选择“控制台应用程序”(如果“DLL”不可用)。某些版本的Visual Studio 不支持通过使用向导创建DLL 项目。您可以稍后对此进行更改,以将项目编译为DLL。 7.在“Win32 应用程序向导”的“应用程序设置”页中,选择“附加选项”下的“空项目”。 8.单击“完成”创建项目。 向动态链接库添加类 1.若要为新类创建头文件,请从“项目”菜单中选择“添加新项…”。将显示“添加新项”对话框。 在“类别”窗格中,选择“Visual C++”下的“代码”。在“模板”窗格中选择“头文件(.h)”。为 头文件选择一个名称,如MathFuncsDll.h,并单击“添加”。将显示一个空白文件。 2.添加一个名为“MyMathFuncs”的简单类,以执行常见的算术运算,如加、减、乘和除。代 码应与以下内容类似: 复制 // MathFuncsDll.h namespace MathFuncs { class MyMathFuncs { public: // Returns a + b static __declspec(dllexport) double Add(double a, double b); // Returns a - b static __declspec(dllexport) double Subtract(double a, dou ble b); // Returns a * b static __declspec(dllexport) double Multiply(double a, dou ble b); // Returns a / b // Throws DivideByZeroException if b is 0 static __declspec(dllexport) double Divide(double a, doubl e b); }; } 3.请注意此代码方法声明中的__declspec(dllexport)修饰符。这些修饰符使DLL 能够导出 该方法以供其他应用程序使用。有关更多信息,请参见dllexport, dllimport。

windowsapi编程之动态链接库(dll)

Windows API编程之动态链接库(DLL) 本文总结Windows API编程之动态链接库(DLL),内容涉及DLL的制作、发布、使用及相关技术以供大家参考。 作者:tyc611,2007-05-26 链接库分为静态链接库和动态链接库,而动态链接库在使用时,又进一步分为装载时链接和运行时链接。装载时链接是指该动态链接库是在程序装入时进行加载链接的,而运行时链接是指该动态链接库是在程序运行时执行LoadLibrary(或LoadLibraryEx,下同)函数动态加载的。因此,由于动态链接库有这两种链接方式,所以在编写使用DLL的程序时,就有了两种可选方案。 可能有人会问“为什么需要装载时链接?直接静态链接 不就行了吗?”,这是模块化程序设计的需要。试想,如果你开发一个很大的程序,并且经常需要更新。如果你选择静态链接,那么每次更新就必须更新整个exe文件,而如果你把需要经常更新的模块做成dll,那么只需要更新这个文件即可,每次程序运行时加载这个更新的文件即可。 在进入编写DLL程序之前,先介绍一些相关知识。 VC支持三种DLL,它们分别是Non-MFC DLL、MFC Regular DLL、MFC Extension DLL。由于本文只讲解API 编程,所以这里只对第一种DLL进行介绍,后面两种DLL 将在另外的文章中介绍。

动态链接库的标准后缀是.DLL,当然也可以使用其它任意后缀名。但使用.DLL后缀的好处是:一是,很直观表明该文件的性质;二是,只有后缀为.DLL的动态链接库才能被Windows自动地加载,而其它后缀的动态链接库只能通过LoadLibrary显示式加载。 动态链接库的用途:一是作为动态函数库使用,另一个常用的方式是作为动态资源库。当然,没有绝对的划分,比如你的动态函数库时也可能有资源,但动态资源库一般不会有函数。 另两个重要的、需要区分的概念是:对象库(Object Library)和导入库(Import Library)。对象库是指普通的库文件,比如C运行时库libc.lib;而导入库是一种比较特殊的对象库文件,与一个动态链接库相对应。它们都有后缀.lib,并且都仅在程序编译链接时使用,被链接器用来解析函数调用。然而,导入库不包含代码,它只为链接器提供动态链接库的信息,以便于链接器对动态链接库中的对象作恰当地链接。 动态链接库的查找规则。如果在使用时没有指定动态链接库的路径,则Windows系统按如下顺序搜索该动态链接库:使用该动态链接库的.exe文件所在目录、当前目录、Windows系统目录、Windows目录、环境变量%PATH%中的路径下的目录。

直放站各种告警处理方法

直放站各种告警处理方法 一、直放站的原理介绍 1、直放站是一种射频双向无线放大器,它放大基站的下行信号,同时也放 大来自移动终端的上行信号。它采用透明传输,不附加调制解调。直放站分为室外直放站和室内直放站。 直放站设备原理框图 直放站主要由施主天线、两组双工器、两组低噪放(LNA)模块、两组功放(PA)模块、重发天线、电源模块、监控模块、无线MODEM模块及外壳等组成。不同类型的直放站是在此基础上,增加了相应的模块(如选频模块等)而组成的。施主天线通过无线方式接收来自基站的信号。光纤直放站与之区别的是在基站侧有个近端机,通过光纤的方式把信号传至远端机,以此来传输信号。 2、直放站的种类 ◇宽带直放站 ◇选频直放站 ◇移频直放站 ◇光纤直放站 ◇室内直放站 二、直放站及室内分布系统告警种类及处理方法 (一)、紧急告警 1、电源掉电告警

产生原因:直放站的市电停电 对覆盖区的影响:覆盖区无信号 处理方法:安装备用蓄电池 2、电源故障告警 产生原因:直放站电源模块故障,输出电压异常 对覆盖区的影响:设备工作不稳定导致覆盖信号不稳定 处理方法:更换电源模块 说明:如出现电源故障告警,很可能伴随出现电源掉电告警 3、下行输出过功率告警 产生原因:直放站的下行输出功率电平高于设定的下行输出 对覆盖区的影响:覆盖信号弱,无法满功率输出 处理方法:检查门限值是否正确,必要时调低输出电平值 说明:如出现下行输出过功率告警,有可能会出现自激告警 4、低噪放故障告警 产生原因:上行低噪放工作异常 对覆盖区的影响:到功放模块的信号没有或很低,影响覆盖;覆盖信号弱 或无信号 处理方法:更换低噪放模块 5、功放告警 产生原因:上行功放工作异常 对覆盖区的影响:不能放大信号,覆盖信号弱或无信号 处理方法:更换功放模块单 注:电源故障告警、低噪放故障告警、功放告警、均属于直放站机器固件损坏,无法自动恢复。 (二)、重要告警 1、收信号电平告警(网络信号检测仪) 产生原因:接收信号电平低于设置门限,有可能是光线折损 对覆盖区的影响:覆盖信号弱,接收信号变差 处理方法:检查光线情况,必要时更换尾纤 2、下行输入欠功率告警 产生原因:直放站的下行输入功率电平低于设定的下行输入 对覆盖区的影响:覆盖信号弱,无法满功率输出 处理方法:检查信源情况 3、下行驻波比告警 产生原因:直放站的覆盖端总驻波比高于设定的下行驻波比 对覆盖区的影响:输出功率变差,通话质量差

动态链接库的使用方法

动态链接库的使用方法 动态链接库是一堆变量,函数和类的集合体,供其它函数调用。 为什么要使用动态链接库,原因很多,其中三条1.可跨平台调用2.方便二次开发3.方便项目管理。 动态链接库的使用有两个方面,一是把原来的源代码做成动态链接库文件(即生成DLL和lib 格式的文件),二是在其它源代码中使用动态链接库。 把源代码做成动态链接库文件 可以使用vc6.0及其以上的版本来做,直接建一个动态链接库工程,这个工程和其它的工程类似,有头文件和源文件,不同之处是在为了让DLL导出函数,需在每一个要导出的函数前添加标识符_declspec(dllexport)或declspec(dllimport)。 在头文件中,申明要导出的函数,类,以及一些全局变量。在源文件中,定义或实现头文件中要导出的函数,类以及变量。 做单独的头文件,该头文件可以同时用于动态链接库和使用动态链接库的程序。 为了方便的添加标识符,我们一般在头文件中使用宏定义,示例如下: #ifdef DLL1_API #else #define DLL1_API _declspec(dllimport) #endif 这样在后面的使用中,可以用DLL1_API来代替_declspec(dllimport),如下: DLL1_API int add (int a,int b); DLL1_API int subtract(int a,int b); class DLL1_API Point { public: void output(int x,int y); }; 在动态链接库的源文件中包含动态链接库头文件和一条宏定义 在源文件中,要重新定义标识符,使用_declspec(dllexport),所以在源文件中也要添加一条宏定义#define DLL1_API _declspec(dllexport),之后再包含头文件#include "Dll1.h" 二.在目标程序中调用动态链接库 在使用动态链接库的程序中隐式的调用动态链接库: 1.把动态链接库的头文件拷贝到目标程序目录下 2.在使用动态链接库的源文件中包含该头文件 3.拷贝动态链接库的两个文件到目标程序目录下 4.在vc6.0的工程/设置/连接中的对象/库模块中输入动态链接库文件名,如DLL1.lib 三.其它 1.关于DLL中全局变量的定义 在头文件中声明,在源文件中定义,如: 在头文件中extern _declspec(dllimport) int num_cai1; 在源文件中则是int num_cai1=200;

VC++ 2017 动态链接库的创建和使用总结

Visual studio c++ 2017 动态链接库的创建和使用总结 一动态链接库的创建两种方式: 1、只有从文件->新建->项目->Windows桌面-> Windows桌面向导->选择“动态链接 库(.dll)->生成解决方案,才会生成.dll和.lib文件。 (1)在头文件声明中(注意要在头文件变量和函数声明中,而不是在变量和函数的定义中声明),不加extern “C”修饰,编译成DLL后,用depends.exe查看导出函数名。 可以看出,导出的函数名都被编译器篡改了。

(2)在头文件声明中,变量和函数名前加extern “C”修饰后,编译成DLL后,再用depends.exe查看导出函数名。 可以看出,用extern “C”修饰的函数名,编译后函数名保持不变。类及成员函数不能用extern “C”修饰,编译成DLL后,成员函数名发生了改变。 2、如果从文件->新建->项目->动态链接库(DLL)->生成解决方案,就只生成.dll,不生成.lib。

二动态链接库的调用两种方式: 1、显式调用 (1)使用显式调用的前提:创建的DLL,编译时不要篡改函数名称,定义函数名时,可用extern “C”修饰函数名,保证编译时,函数名不被篡改。否则GetProcAddress( )不能正确地获取dll中的函数名。 但是导出的类不能使用extern “C”修饰。 (2)使用显式调用的优点:不用动态链接库的.h和.lib文件,只要有.dll文件就可调用库函数,使用LoadLibrary(),在需要调用.dll中的库函数时,才动态加载到内存中,使用完毕后,可以用FreeLibrary()释放内存中的dll;使用GetProcAddress( )获取dll中的函数名。必须事先知道dll中的函数名和形式参数。 (3)使用显式调用缺点:调用每个函数时,都必须使用 GetProcAddress( )获取dll中的函数名,并转换成原来的函数,比较麻烦。而隐式调用DLL函数,由于使用了DLL的头文件.h,使用起来非常方便。 2、隐式调用 (1)隐式调用DLL函数缺点: 应用程序加载时,在内存中载入DLL动用库中的函数、变量、或类。使用完毕后,DLL 也不会从内存中释放。 .lib包含了库函数的入口,但不包含函数代码,应用程序调用时,才从dll中载入。(2)隐式调用DLL函数优点: 应用程序调用dll时,需要.lib和.h文件,在应用程序.exe文件夹debug或者release 中有DLL文件,即.h、.lib和.dll三个文件,在应用程序中直接使用DLL中的类和函数,可以不考虑编译DLL函数和变量名发生改变的问题。不需要像显式调用那样,函数需要 用 GetProcAddress( )一一获取。 隐式调用DLL中的变量、函数和类,有两种方法: (1)在主程序中包含DLL的头文件dll.h,在main( )前加上#pragma comment(lib,”dll.lib”),没有分号,再在debug或release中复制DLL.dll。 (2)在主程序中包含DLL的头文件dll.h,在项目属性->链接器->添加依赖项中加上“dll.lib;“,再在debug或release中复制DLL.dll,即可。

C#调用动态链接库

C#程序实现动态调用DLL的研究 摘要:在《csdn开发高手》2004年第03期中的《化功大法——将DLL嵌入EXE》一文,介绍了如何把一个动态链接库作为一个资源嵌入到可执行文件,在可执行文件运行时,自动从资源中释放出来,通过静态加载延迟实现DLL函数的动态加载,程序退出后实现临时文件的自动删除,从而为解决“DLL Hell”提供了一种解决方案。这是一个很好的设计思想,而且该作者也用C++实现了,在Internet上也有相似的VB程序,但在某一技术论坛上提起这种设计方法时,有网友提出:“这种方法好是好,但就是启动速度太慢”。这是因为程序启动时实现DLL释放,然后再加载释放出来的DLL,这个过程会耗费一定的时间。鉴于此问题,经过思索,提出另一个设计方案:DLL作为资源文件嵌入程序,但不需进行DLL释放及其重新加载。本文就是对该设计方案的原理分析及使用C#编程来实现该设计方案。 关键词:动态调用DLL,嵌入DLL,C# 正文: 一、DLL与应用程序 动态链接库(也称为DLL,即为“Dynamic Link Library”的缩写)是Microsoft Windows最重要的组成要素之一,打开Windows系统文件夹,你会发现文件夹中有很多DLL文件,Windows就是将一些主要的系统功能以DLL模块的形式实现。 动态链接库是不能直接执行的,也不能接收消息,它只是一个独立的文件,其中包含能被程序或其它DLL调用来完成一定操作的函数(方法。注:C#中一般称为“方法”),但这些函数不是执行程序本身的一部分,而是根据进程的需要按需载入,此时才能发挥作用。 DLL只有在应用程序需要时才被系统加载到进程的虚拟空间中,成为调用进程的一部分,此时该DLL也只能被该进程的线程访问,它的句柄可以被调用进程所使用,而调用进程的句柄也可以被该DLL所使用。在内存中,一个DLL只有一个实例,且它的编制与具体的编程语言和编译器都没有关系,所以可以通过DLL来实现混合语言编程。DLL函数中的代码所创建的任何对象(包括变量)都归调用它的线程或进程所有。 下面列出了当程序使用DLL时提供的一些优点:[1] 1)使用较少的资源 当多个程序使用同一个函数库时,DLL可以减少在磁盘和物理内存中加载的代码的重复量。这不仅可以大大影响在前台运行的程序,而且可以大大影响其他在Windows操作系统上运行的程序。 2)推广模块式体系结构 DLL有助于促进模块式程序的开发。这可以帮助您开发要求提供多个语言版本的大型程序或要求具有模块式体系结构的程序。模块式程序的一个示例是具有多个可以在运行时动态加载的模块的计帐程序。 3)简化部署和安装 当DLL中的函数需要更新或修复时,部署和安装DLL不要求重新建立程序与该DLL的链接。此外,如果多个程序使用同一个DLL,那么多个程序都将从该更新或修复中获益。当您使用定期更新或修复的第三方DLL时,此问题可能会更频繁地出现。 二、DLL的调用

(动态链接库)DLL编写与使用方法

DLL的创建与调用 1、DLL的概念 DLL(Dynamic Linkable Library),动态链接库,可以向程序提供一些函数、变量或类。这些可以直接拿来使用。 静态链接库与动态链接库的区别: (1)静态链接库与动态链接库都是共享代码的方式。静态链接库把最后的指令都包含在最终生成的EXE 文件中了;动态链接库不必被包含在最终EXE文件中,EXE文件执行时可以“动态”地引用和卸载这个与EXE独立的DLL文件。 (2)静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。 动态链接库的分类:Visual C++支持三种DLL,它们分别是Non-MFC DLL(非MFC动态库)、MFC Regular DLL(MFC规则DLL)、MFC Extension DLL(MFC扩展DLL)。非MFC动态库不采用MFC 类库结构,其导出函数为标准的C接口,能被非MFC或MFC编写的应用程序所调用;MFC规则DLL 包含一个继承自CWinApp的类,但其无消息循环;MFC扩展DLL采用MFC的动态链接版本创建,它只能被用MFC类库所编写的应用程序所调用。 2、创建一个DLL 2.1 非MFC的DLL 2.1.1声明导出函数: extern “C” __declspec(dllexport) int add(int a, int b); 其中extern “C”为声明为C编译。由于C++编译器在编译的时候会造成其函数名的该变,在其他应用程序中导致函数不可调用,而C编译器则不会在编译后改变其函数名。这样如果用C编译的程序来调用该dll中的函数时,可能会造成找不到该函数。 __declspec(dllexport)表示该函数为DLL输出函数,即其他应用程序可以调用该函数 从dll中声明输出函数有两种方式: (1)另外一种方式是采用模块定义(.def) 文件声明,.def文件为链接器提供了有关被链接程序的导出、属性及其他方面的信息。 (2)用__declspec(dllexport)来声明函数 如果使用Visual C++来创建dll,对于同样用VC创建的exe来说,调用dll没有什么问题。而如果用其他工具来创建的exe来调用dll,就会出现问题。因为即使你不用C++编译器,Microsoft C编译器也会损害C函数。当用__stdcall将函数输出时,C编译器会将函数改为_func@1的形式。在这里需要在.def 文件中加入EXPORTS节来输出函数: EXPORTS func 这样,dll将用func函数名来输出函数。 另一种方式是用#pragma (linker, “/exports:func=_func@1”),告诉编译器输出函数func,这种方式没有前一种好。 如果通过VC++编写的DLL欲被其他语言编写的程序调用,应将函数的调用方式声明为__stdcall方式,WINAPI都采用这种方式,而C/C++ 缺省的调用方式却为__cdecl。__stdcall方式与__cdecl对函数名最终生成符号的方式不同。若采用C编译方式(在C++中需将函数声明为extern "C"),__stdcall调用约定在输出函数名前面加下划线,后面加“@”符号和参数的字节数,形如_functionname@number;

相关文档
最新文档