欢迎访问 Lu程序设计

C/C++使用Lu扩展动态库

1 说明

    要演示本文的例子,你必须下载Lu64脚本系统。本文的例子需要lu64.dll、lu64.lib、C++格式的头文件lu64.h,相信你会找到并正确使用这几个文件。

    用C/C++编译器创建一个控制台应用程序,复制本文的例子代码直接编译运行即可。

2 关于Lu扩展动态库的使用

    Lu扩展动态库只有一个输出函数:

    //Lu扩展动态库唯一的输出函数;
    //hLu:Lu64.dll的句柄;iInit!=0:初始化动态库,iInit=0:释放动态库;
    //me:指向任意数据的指针,可用于验证用户能否使用该库,为了方便验证,约定该指针指向一个wchar_t类型的字符串。
    //iInit!=0时,返回值LuDll=0:初始化失败;LuDll=1:初始化成功;返回值LuDll=2:初始化成功,仅注册一些常量,初始化完成后可卸载该库。
    //iInit=0时,返回值LuDll=0:释放失败;LuDll=1:释放成功;
    extern "C" int _stdcall LuDll64(HINSTANCE hLu,int iInit,void *me)
    {
                .
                .
                .

        if(iInit)   
//初始化动态库
        {
                .
                .
                .

            return 1;
        }
        else       
//释放动态库
        {
                .
                .
                .

            return 1;
        }
    }

    所以加载Lu扩展动态库后,调用函数LuDll64(hLu, 1, me)即可完成初始化工作,使用完该库后,调用函数LuDll64(hLu, 0, NULL)即可完成释放工作。

3 代码

#include <windows.h>
#include <iostream>
#include "lu64.h"

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

using namespace std;

void main(void)
{
	void *hFor;		//表达式句柄
	luINT nPara;		//存放表达式的自变量个数
	LuData *pPara;		//存放输入自变量的数组指针
	LuData Val;		//存放表达式的值
	luINT ErrBegin,ErrEnd;	//表达式编译出错的初始位置和结束位置
	int ErrCode;		//错误代码
	wchar_t ForStr[]=L"Add(1.1,2.2)+Sub(6.6,5.5)+pi";	//字符串表达式
	HINSTANCE hLu;		//核心库lu64.dll句柄
	HINSTANCE hDllExample;	//扩展库DllExample.dll句柄
	luDll pluDll;		//Lu扩展库唯一的输出函数

	if(!InitLu()) return;	//初始化Lu

	hLu=GetModuleHandle(L"lu64.dll");	//获得核心库lu64.dll的句柄
	hDllExample=LoadLibrary(L"DllExample.dll");	//加载动态库DllExample.dll
	if(hDllExample)
	{
		//获得扩展库DllExample唯一的输出函数
		pluDll=(luDll)GetProcAddress(hDllExample,"LuDll64");
		if(pluDll)
		{
			if(!pluDll(hLu,1,NULL))	//初始化失败
			{
				FreeLibrary(hDllExample);    //释放动态库DllExample.dll
				hDllExample=NULL;
			}
		}
	}

	ErrCode=LuCom(ForStr,0,0,0,hFor,nPara,pPara,ErrBegin,ErrEnd);	//编译表达式
	if(ErrCode)
	{
		cout<<"表达式有错误!错误代码:"<<ErrCode<<endl;
	}
	else
	{
		Val=LuCal(hFor,pPara);	//计算表达式的值
		if(Val.BType==luStaData_double) cout << *(double *)&(Val.x) << endl;
	}

	if(hDllExample)
	{
		pluDll(hLu,0,NULL);	//释放Lu扩展库
		FreeLibrary(hDllExample);	//释放动态库DllExample.dll
	}

	FreeLu();			//释放Lu
}

运行结果:

7.5416

4 函数说明

    本例用到了Lu的4个输出函数:初始化Lu的函数InitLu,释放Lu的函数FreeLu,编译表达式的函数LuCom、 计算表达式的函数LuCal。从这里查看这些函数的说明:Lu编程指南

5 难点分析

    要演示本文的代码,需要加载上篇教程代码生成的DllExample.dll,参考上一篇教程用C/C++设计Lu扩展动态库

    在Lu64脚本系统中,已经实现的主要Lu扩展库参考Lu脚本系统说明,源代码下载:lu2code.zip,用户可根据需要加载使用它们。

6 其他

    你可能注意到了,我的联系方式就在下面,如有不明之处或有什么建议,可随时与我进行联系。


版权所有© Lu程序设计 2002-2021,保留所有权利
E-mail: forcal@sina.com
  QQ:630715621
最近更新: 2021年05月23日