在应用开发过程中,特别是企业级别的开发应用,我们习惯使用JAVA用业务逻辑,原因有:1,它是开源的,2。有完整的社区支持。3.跨平台,具有很好的移植性。4.网络功能强大。
但有时JAVA的操作会受限,比如实时性方面,还有操作底层Windows接口方面,代码的封装性方面都比较逊色于VC之DLL。而且在做JAVA开发时,由于它比较笨重,默认的企业级应用都打开着。应用软件开发师不得不发费比较长的学习曲线学习,从J2SE到J2EE,再到JAVA EE,以及数不情的应用架构。应用开发者疲于学习。但相对而言,PYTHON,学习曲线比较低,使用简单,而且功能强大,基本上JAVA能够了的事情,它都可以胜任,在应用方面,比较适合新手学习和使用。在我看来,阅读Python代码,就像阅读一篇E文一样,是那样的有趣。而在视图层来讲,目前比较流行的有JAVAFX,SIVERLIGHT,FLEX,由于HTML5还没有统一的标准,在RIA应用方面,首选的就是FLEX了。所以在这里我打通了VC,PYTHON,FLEX之间的通信,通过一个应用的例子,来讲解它们是如何实现的。
1.VC之DLL编程
简介:
自从微软推出16位的Windows操作系统起,此后每种版本的Windows操作系统都非常依赖于动态链接库(DLL)中的函数和数据,实际上Windows操作系统中几乎所有的内容都由DLL以一种或另外一种形式代表着,例如显示的字体和图标存储在GDI DLL中、显示Windows桌面和处理用户的输入所需要的代码被存储在一个User
DLL中、Windows编程所需要的大量的API函数也被包含在Kernel DLL中。
在Windows操作系统中使用DLL有很多优点,最主要的一点是多个应用程序、甚至是不同语言编写的应用程序可以共享一个DLL文件,真正实现了资源"共享",大大缩小了应用程序的执行代码,更加有效的利用了内存;使用DLL的另一个优点是DLL文件作为一个单独的程序模块,封装性、独立性好,在软件需要升级的时候,开发人员只需要修改相应的DLL文件就可以了,而且,当DLL中的函数改变后,只要不是参数的改变,程序代码并不需要重新编译。这在编程时十分有用,大大提高了软件开发和维护的效率。
打开vc++6.0建立一个工作区间,然后file->new->projects->Win32 Dynamic-Link Library->空dll
新建funDll.cpp.
例子:
// funDll.cpp : Defines the entry point for the DLL application.
//
#include "stdafx.h"
#include <iostream>
using namespace std;
#ifdef _MANAGED
#pragma managed(push, off)
#endif
#ifdef __cplusplus
#define EXPORT extern "C"__declspec(dllexport)
#else
#define EXPORT __declspec(dllexport)
#endif
EXPORT int HelloWorld()
{
cout <<"hello world" <<endl;
return 0;
}
/*
EXPORT int Max(int a, int b)
{
if(a>=b)
return a;
else
return b;
}
*/
EXPORT int Min(int a, int b)
{
if(a>=b)
return b;
else
return a;
}
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
return TRUE;
}
#ifdef _MANAGED
#pragma managed(pop)
#endif
2.接着我使用python来访问这个封装好了的DLL动态链接库,一般而言,里面的内容,只有提拱接口才可以访问,它的安全性比较高。
Python的相关代码如下:
#coding=utf-8
'''
Created on 2011-11-29
@author: LONMID
'''
import web
from ctypes import *
urls = (
'/(.*)', 'hello'
)
app = web.application(urls, globals())
fileName = "funDll.dll"
func = cdll.LoadLibrary(fileName)
class hello:
def GET(self, name):
if not name:
name =func.Max(1,67) + func.HelloWorld()
return 'Hello, ' + name + '!'
if __name__ == "__main__":
app.run()
注意:在这里我使用webpy框架,在地址栏输入http:localhost:8080/hello 即可打印出Dll里面的内容细节。
3.最后使用flex,来呈现python处理的结果,python就是一个中转站,具有业务逻辑。然后提拱给flex使用。
flex的相关代码是:
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600">
<fx:Script>
<![CDATA[
import mx.events.FlexEvent;
import mx.rpc.events.ResultEvent;
import mx.rpc.http.mxml.HTTPService;
import mx.controls.Alert;
//使用动态的HTTPSERVIER
public var pythonHttpService:HTTPService = new HTTPService();
protected function button1_clickHandler(event:MouseEvent):void
{
var txtValue:String = txtInput.text;
if(txtValue.length !=0 ){
pythonHttpService.url = "http://localhost:8080/"+txtValue;
pythonHttpService.method = "post";
pythonHttpService.addEventListener(ResultEvent.RESULT, pythonHttpHandler);
pythonHttpService.send();
//发送出去
}
}
public function pythonHttpHandler(event:ResultEvent):void{
var stringValue:String = new String(event.result);
Alert.show(stringValue);
}
]]>
</fx:Script>
<fxeclarations>
<!-- 将非可视元素(例如服务、值对象)放在此处 -->
</fxeclarations>
<s:Button x="61" y="164" label="点击我" click="button1_clickHandler(event)"/>
<sabel x="61" y="125" width="50" height="23" text="请输入:"/>
<s:TextInput x="118" y="125" id="txtInput" />
</s:Application>
上面是一个简单的应用例子,通过上面的例子,我们可以了解它们之间的通信过程,相比较JAVA而言,它适合于业务逻辑不复杂的企业级应用中。