VS2010与PB10开发和使用PBNI-初步使用3
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
PBNI初步使用三(函数功能调用-代码优化)
下面讲解如何使用VS2010开发PB10.5版本PBNI组件应用实例:在VS中创建一个f_add的函数,实现2个int类型的数值进行相加。
PB调用和使用这个函数功能代码的优化。
1 优化和使用PBNIADD代码
将项目管理中多余的文件进行删除,系统仅仅只是留下3个主要的文件。
Stdafx.h,PBNIAdd.cpp和PBNIAdd.h这三个文件。
如下图:
stdafx,.h代码主要定义生成DLL文件的入口。
代码如下:
#pragma once
#ifndef STRICT
#define STRICT
#endif
#ifndef WINVER
#define WINVER 0x0400
#endif
#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0400
#endif
#define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers
//Pull in support for Commctrl v6
#ifdef _UNICODE
#if defined _M_IX86
#pragma comment(linker,"/manifestdependency:\"type='win32'
name='mon-Controls' version='6.0.0.0' processorArchitecture='x86'
publicKeyToken='6595b64144ccf1df' language='*'\"")
#elif defined _M_IA64
#pragma comment(linker,"/manifestdependency:\"type='win32'
name='mon-Controls' version='6.0.0.0' processorArchitecture='ia64'
publicKeyToken='6595b64144ccf1df' language='*'\"")
#elif defined _M_X64
#pragma comment(linker,"/manifestdependency:\"type='win32'
name='mon-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\"")
#else
#pragma comment(linker,"/manifestdependency:\"type='win32'
name='mon-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
#endif
#endif
PBNIApp.h代码主要声明类和函数。
代码无须变化,代码如下:
class PBNIAdd: public IPBX_NonVisualObject
{
public:
PBNIAdd();
virtual ~PBNIAdd();
PBXRESULT Invoke(
IPB_Session *session,
pbobject obj,
pbmethodID mid,
PBCallInfo *ci);
int f_add(IPB_Session*, pbint, pbint);
// Enum used to provide entry points for each method in the class - this case is mAdd
enum MethodIDs
{
mAdd = 0
};
private:
virtual void Destroy();
};
点击PBNIApp.cpp代码主要声名定义和具体函数。
之前对应dllmain.cpp合并在里面,代码如下:// PBNIADD.cpp : 定义DLL 应用程序的导出函数。
// Implement the required Invoke method
#include<pbext.h>
#include"stdafx.h"
#include"PBNIAdd.h"
#include<tchar.h>
BOOL APIENTRY DllMain( HMODULE 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;
}
PBXEXPORT LPCTSTR PBXCALL PBX_GetDescription()
{
static const TCHAR classDesc[] = {
_T("class n_pbniadd from nonvisualobject \n") \
_T("function int f_add(int a,int b) \n") \
_T("end class \n")
};
return (LPCTSTR)classDesc;
}
PBXEXPORT PBXRESULT PBXCALL PBX_CreateNonVisualObject(
IPB_Session * pbSession,
pbobject pbobj,
LPCSTR xtraName,
IPBX_NonVisualObject ** nvobj
)
{
LPCTSTR myclassname = _T("n_pbniadd") ;
if ( _tcscmp(xtraName, myclassname ) == 0 )
{
*nvobj = new PBNIAdd() ;
return PBX_OK ;
} ;
*nvobj = NULL ;
return PBX_E_NO_SUCH_CLASS ;
};
PBXRESULT PBNIAdd:: Invoke(IPB_Session *Session,pbobject obj, pbmethodID mid, PBCallInfo *ci)
{
// if the method to call is f_add
if (mid == mAdd)
{
int sum = f_add(Session, ci->pArgs->GetAt(0)->
GetInt(), ci->pArgs->GetAt(1)->GetInt());
ci->returnValue->SetInt(sum);
}
return PBX_OK;
}
// constructor and destructor
PBNIAdd:: PBNIAdd()
{}
PBNIAdd:: ~PBNIAdd()
{}
// implement the class’s f_add metho d
int PBNIAdd:: f_add(IPB_Session* session, pbint arg1,pbint arg2)
{
return arg1+arg2;
}
// Implement the required Destroy method
void PBNIAdd::Destroy()
{
delete this;
}
2设置PBNIAdd的项目属性:
在解决方案资源管理器的PBNIADD项目上右击,弹出右键菜单选择属性,在配置属性的常规页中设置如下:配置选择所有配置,平台为win32,平台工具集为V100,字符集为多字节字符集。
预编译,设置不使用预编译头。
如图:
3 代码编译
编译后会按照设置的编译属性,放去Debug目录下
4 PB10进行引用和调用
选择PBNIADD.dll导入成功后
创建一个窗口,对对象进行调试分析
窗口名字为w_test
PB对应窗口的测试代码如下:
应用打开测试窗口
需要注意把PBNIADD.dll复制到PB对应的PBL目录
简化代码的目的:
✧为下一步更好的完善和调用PBNI的多对象和多功能做好准备,并实际了解清楚编译一个PBNI需要用到那些文件和实际需要引用的文
件。
✧PBNI的程序编写可以主要看为3个文件,其中stdafx.h定义Dll文件入口,PBNIAdd.h定义类的说明,PBNIAdd.cpp为实现类的主要代
码。