#
declare
c number(4);
begin
for k in 1..13 loop
c := 590+k;
dbms_job.submit(c,
'ODS_UTL_DIFF.DIFF('||k||',2,''0,21'');',
sysdate,
'trunc(sysdate)+21/24+7');
commit;
end loop;
end;
qt4内置有sqlite插件,可以直接使用sqlite.但是发现插入中文时会有乱码问题。
以windows为例,qt4内置编码为system(GBK).而sqlite内部编码为unicode.
如果插入中文首先要转换为unicode.而从数据库读取时则不需要,因为qt会自动侦测编码,
实例代码:
//插入记录
QSqlQuery query;
QByteArray sql = "insert into person values(1, 'hello', '你好!')";
QTextCodec *codec = QTextCodec::codecForName("GBK");
QString string = codec->toUnicode(sql);
query.exec(string);
//读入记录
QSqlQuery query("select * from person");
while (query.next()) {
QString string = query.value(2).toString();;
QMessageBox::information(0, "infa", string, QMessageBox::Ok);
}
1. Transformation代表Informatica Server对数据的操作。 Transformation分类:Active和Passive 输入跟输出的记录数会发生改变 不能re-linked到另一个data stream 例子:Aggregator, Filter, Joiner, Normalizer, Rank, Update Strategy, Advanced External Procedure, ERP Source Qualifier and Source Qualifier, Application Source Qualifier, Router, Sorter Passive transformations 输入跟输出的记录数一样 可以re-linked到另一个data stream 例子:Expression, External Procedure, Lookup, Sequence Generator Stored Procedure, Input, Output, XML Source Qualifier Transformations分类 : connected 和 unconnected,unconnected transformation在其他的组件中被调用并且有返回值。
ETL的简介:
ETL即数据抽取(Extract)、转换(Transform)、装载(Load)的过程,它是构建数据仓库的重要环节
1、 数据清洗
数据清洗的任务是过滤那些不符合要求的数据,将过滤的结果交给业务主管部门,确认是否过滤掉还是由业务单位修正之后再进行抽取。不符合要求的数据主要是有不完整的数据、错误的数据、重复的数据三大类。
(1)不完整的数据:这一类数据主要是一些应该有的信息缺失,如供应商的名称、分公司的名称、客户的区域信息缺失、业务系统中主表与明细表不能
匹配等。对于这一类数据过滤出来,按缺失的内容分别写入不同Excel文件向客户提交,要求在规定的时间内补全。补全后才写入数据仓库。
(2)错误的数据:这一类错误产生的原因是业务系统不够健全,在接收输入后没有进行判断直接写入后台数据库造成的,比如数值数据输成全角数字字
符、字符串数据后面有一个回车操作、日期格式不正确、日期越界等。这一类数据也要分类,对于类似于全角字符、数据前后有不可见字符的问题,只能通过写
SQL语句的方式找出来,然后要求客户在业务系统修正之后抽取。日期格式不正确的或者是日期越界的这一类错误会导致ETL运行失败,这一类错误需要去业务
系统数据库用SQL的方式挑出来,交给业务主管部门要求限期修正,修正之后再抽取。
(3)重复的数据:对于这一类数据——特别是维表中会出现这种情况——将重复数据记录的所有字段导出来,让客户确认并整理。
数据清洗是一个反复的过程,不可能在几天内完成,只有不断的发现问题,解决问题。对于是否过滤,是否修正一般要求客户确认,对于过滤掉的数据,
写入Excel文件或者将过滤数据写入数据表,在ETL开发的初期可以每天向业务单位发送过滤数据的邮件,促使他们尽快地修正错误,同时也可以做为将来验
证数据的依据。数据清洗需要注意的是不要将有用的数据过滤掉,对于每个过滤规则认真进行验证,并要用户确认。
2、 数据转换
数据转换的任务主要进行不一致的数据转换、数据粒度的转换,以及一些商务规则的计算。
(1)不一致数据转换:这个过程是一个整合的过程,将不同业务系统的相同类型的数据统一,比如同一个供应商在结算系统的编码是XX0001,而在CRM中编码是YY0001,这样在抽取过来之后统一转换成一个编码。
(2)数据粒度的转换:业务系统一般存储非常明细的数据,而数据仓库中数据是用来分析的,不需要非常明细的数据。一般情况下,会将业务系统数据按照数据仓库粒度进行聚合。
(3)商务规则的计算:不同的企业有不同的业务规则、不同的数据指标,这些指标有的时候不是简单的加加减减就能完成,这个时候需要在ETL中将这些数据指标计算好了之后存储在数据仓库中,以供分析使用。
三、ETL日志、警告发送
1、 ETL日志
ETL日志分为三类。一类是执行过程日志,这一部分日志是在ETL执行过程中每执行一步的记录,记录每次运行每一步骤的起始时间,影响了多少行
数据,流水账形式。一类是错误日志,当某个模块出错的时候写错误日志,记录每次出错的时间、出错的模块以及出错的信息等。第三类日志是总体日志,只记录
ETL开始时间、结束时间是否成功信息。如果使用ETL工具,ETL工具会自动产生一些日志,这一类日志也可以作为ETL日志的一部分。记录日志的目的是
随时可以知道ETL运行情况,如果出错了,可以知道哪里出错。
2、 警告发送
如果ETL出错了,不仅要形成ETL出错日志,而且要向系统管理员发送警告。发送警告的方式多种,一般常用的就是给系统管理员发送邮件,并附上出错的信息,方便管理员排查错误。
ETL是BI项目的关键部分,也是一个长期的过程,只有不断的发现问题并解决问题,才能使ETL运行效率更高,为BI项目后期开发提供准确的数据。
配置模板:config.vc
# ========================================================================= # This configuration file was generated by # Bakefile 0.2.1 (http://bakefile.sourceforge.net) # Beware that all changes made to this file will be overwritten next # time you run Bakefile! # =========================================================================
# ------------------------------------------------------------------------- # These are configurable options: # -------------------------------------------------------------------------
# C compiler CC = cl
# C++ compiler CXX = cl
# Standard flags for CC CFLAGS =
# Standard flags for C++ CXXFLAGS =
# Standard preprocessor flags (common for CC and CXX) CPPFLAGS =
# Standard linker flags LDFLAGS =
# The C preprocessor CPP = $(CC) /EP /nologo
# What type of library to build? [0,1] SHARED = 0
# Build wxUniversal instead of native port? [0,1] WXUNIV = 0
# Compile Unicode build of wxWidgets? [0,1] UNICODE = 0
# Use MSLU library when building Unicode version. [0,1] MSLU = 0
# Type of compiled binaries [debug,release] BUILD = release
# The target processor architecture must be specified when it is not X86. # This does not affect the compiler output, so you still need to make sure # your environment is set up appropriately with the correct compiler in the # PATH. Rather it affects some options passed to some of the common build # utilities such as the resource compiler and the linker. # # Accepted values: AMD64, IA64. TARGET_CPU = $(CPU)
# Should debugging info be included in the executables? The default value # "default" means that debug info will be included if BUILD=debug # and not included if BUILD=release. [0,1,default] DEBUG_INFO = default
# Should __WXDEBUG__ be defined? The default value "default" means that it will # be defined if BUILD=debug and not defined if BUILD=release. [0,1,default] DEBUG_FLAG = default
# Should link against debug RTL (msvcrtd.dll) or release (msvcrt.dll)? # Acts according to BUILD by default. [0,1,default] DEBUG_RUNTIME_LIBS = default
# Multiple libraries or single huge monolithic one? [0,1] MONOLITHIC = 0
# Build GUI libraries? [0,1] USE_GUI = 1
# Build wxHTML library (USE_GUI must be 1)? [0,1] USE_HTML = 1
# Build multimedia library (USE_GUI must be 1)? [0,1] USE_MEDIA = 1
# Build wxXRC library (USE_GUI must be 1)? [0,1] USE_XRC = 1
# Build wxAUI library (USE_GUI must be 1)? [0,1] USE_AUI = 1
# Build wxRichTextCtrl library (USE_GUI must be 1)? [0,1] USE_RICHTEXT = 1
# Build OpenGL canvas library (USE_GUI must be 1)? [0,1] USE_OPENGL = 0
# Build ODBC database classes (USE_GUI must be 1)? [0,1] USE_ODBC = 0
# Build quality assurance classes library (USE_GUI must be 1)? [0,1] USE_QA = 1
# Enable exceptions in compiled code. [0,1] USE_EXCEPTIONS = 1
# Enable run-time type information (RTTI) in compiled code. [0,1] USE_RTTI = 1
# Enable threading in compiled code. [0,1] USE_THREADS = 1
# Link with gdiplus.lib? (Needed for wxGraphicsContext, will also set wxUSE_GRAPHICS_CONTEXT) [0,1] USE_GDIPLUS = 0
# Is this official build by wxWidgets developers? [0,1] OFFICIAL_BUILD = 0
# Use this to name your customized DLLs differently VENDOR = custom
# WX_FLAVOUR =
# WX_LIB_FLAVOUR =
# Name of your custom configuration. This affects directory # where object files are stored as well as the location of # compiled .lib files and setup.h under the lib/ toplevel directory. CFG =
# Compiler flags needed to compile test suite in tests directory. If you want # to run the tests, set it so that the compiler can find CppUnit headers. CPPUNIT_CFLAGS =
# Linker flags needed to link test suite in tests directory. If you want # to run the tests, include CppUnit library here. CPPUNIT_LIBS =
# Version of C runtime library to use. You can change this to # static if SHARED=0, but it is highly recommended to not do # it if SHARED=1 unless you know what you are doing. [dynamic,static] RUNTIME_LIBS = dynamic
makefile: makefile.vc # ========================================================================= # This makefile was generated by # Bakefile 0.2.1 (http://bakefile.sourceforge.net) # Do not modify, all changes will be overwritten! # =========================================================================
!include <../../build/msw/config.vc>
# ------------------------------------------------------------------------- # Do not modify the rest of this file! # -------------------------------------------------------------------------
### Variables: ###
WX_RELEASE_NODOT = 28 OBJS = \ vc_$(PORTNAME)$(WXUNIVNAME)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WXDLLFLAG)$(CFG)$(DIR_SUFFIX_CPU) LIBDIRNAME = .\..\..\lib\vc$(DIR_SUFFIX_CPU)_$(LIBTYPE_SUFFIX)$(CFG) SETUPHDIR = \ $(LIBDIRNAME)\$(PORTNAME)$(WXUNIVNAME)$(WXUNICODEFLAG)$(WXDEBUGFLAG) TASKBAR_CXXFLAGS = /M$(__RUNTIME_LIBS_8)$(__DEBUGRUNTIME_3) /DWIN32 \ $(__DEBUGINFO_0) /Fd$(OBJS)\taskbar.pdb $(____DEBUGRUNTIME_2_p) \ $(__OPTIMIZEFLAG_4) $(__NO_VC_CRTDBG_p) /D__WXMSW__ $(__WXUNIV_DEFINE_p) \ $(__DEBUG_DEFINE_p) $(__EXCEPTIONS_DEFINE_p) $(__RTTI_DEFINE_p) \ $(__THREAD_DEFINE_p) $(__UNICODE_DEFINE_p) $(__MSLU_DEFINE_p) \ $(__GFXCTX_DEFINE_p) /I$(SETUPHDIR) /I.\..\..\include /W4 /I. $(__DLLFLAG_p) \ /D_WINDOWS /I.\..\..\samples /DNOPCH $(__RTTIFLAG_9) $(__EXCEPTIONSFLAG_10) \ $(CPPFLAGS) $(CXXFLAGS) TASKBAR_OBJECTS = \ $(OBJS)\taskbar_sample.res \ $(OBJS)\taskbar_tbtest.obj
### Conditionally set variables: ###
!if "$(USE_GUI)" == "0" PORTNAME = base !endif !if "$(USE_GUI)" == "1" PORTNAME = msw !endif !if "$(BUILD)" == "debug" && "$(DEBUG_FLAG)" == "default" WXDEBUGFLAG = d !endif !if "$(DEBUG_FLAG)" == "1" WXDEBUGFLAG = d !endif !if "$(UNICODE)" == "1" WXUNICODEFLAG = u !endif !if "$(WXUNIV)" == "1" WXUNIVNAME = univ !endif !if "$(TARGET_CPU)" == "amd64" DIR_SUFFIX_CPU = _amd64 !endif !if "$(TARGET_CPU)" == "amd64" DIR_SUFFIX_CPU = _amd64 !endif !if "$(TARGET_CPU)" == "ia64" DIR_SUFFIX_CPU = _ia64 !endif !if "$(TARGET_CPU)" == "ia64" DIR_SUFFIX_CPU = _ia64 !endif !if "$(SHARED)" == "1" WXDLLFLAG = dll !endif !if "$(SHARED)" == "0" LIBTYPE_SUFFIX = lib !endif !if "$(SHARED)" == "1" LIBTYPE_SUFFIX = dll !endif !if "$(TARGET_CPU)" == "amd64" LINK_TARGET_CPU = /MACHINE:AMD64 !endif !if "$(TARGET_CPU)" == "amd64" LINK_TARGET_CPU = /MACHINE:AMD64 !endif !if "$(TARGET_CPU)" == "ia64" LINK_TARGET_CPU = /MACHINE:IA64 !endif !if "$(TARGET_CPU)" == "ia64" LINK_TARGET_CPU = /MACHINE:IA64 !endif !if "$(MONOLITHIC)" == "0" EXTRALIBS_FOR_BASE = !endif !if "$(MONOLITHIC)" == "1" EXTRALIBS_FOR_BASE = !endif !if "$(BUILD)" == "debug" && "$(DEBUG_INFO)" == "default" __DEBUGINFO_0 = /Zi !endif !if "$(BUILD)" == "release" && "$(DEBUG_INFO)" == "default" __DEBUGINFO_0 = !endif !if "$(DEBUG_INFO)" == "0" __DEBUGINFO_0 = !endif !if "$(DEBUG_INFO)" == "1" __DEBUGINFO_0 = /Zi !endif !if "$(BUILD)" == "debug" && "$(DEBUG_INFO)" == "default" __DEBUGINFO_1 = /DEBUG !endif !if "$(BUILD)" == "release" && "$(DEBUG_INFO)" == "default" __DEBUGINFO_1 = !endif !if "$(DEBUG_INFO)" == "0" __DEBUGINFO_1 = !endif !if "$(DEBUG_INFO)" == "1" __DEBUGINFO_1 = /DEBUG !endif !if "$(BUILD)" == "debug" && "$(DEBUG_RUNTIME_LIBS)" == "default" ____DEBUGRUNTIME_2_p = /D_DEBUG !endif !if "$(BUILD)" == "release" && "$(DEBUG_RUNTIME_LIBS)" == "default" ____DEBUGRUNTIME_2_p = !endif !if "$(DEBUG_RUNTIME_LIBS)" == "0" ____DEBUGRUNTIME_2_p = !endif !if "$(DEBUG_RUNTIME_LIBS)" == "1" ____DEBUGRUNTIME_2_p = /D_DEBUG !endif !if "$(BUILD)" == "debug" && "$(DEBUG_RUNTIME_LIBS)" == "default" ____DEBUGRUNTIME_2_p_1 = /d _DEBUG !endif !if "$(BUILD)" == "release" && "$(DEBUG_RUNTIME_LIBS)" == "default" ____DEBUGRUNTIME_2_p_1 = !endif !if "$(DEBUG_RUNTIME_LIBS)" == "0" ____DEBUGRUNTIME_2_p_1 = !endif !if "$(DEBUG_RUNTIME_LIBS)" == "1" ____DEBUGRUNTIME_2_p_1 = /d _DEBUG !endif !if "$(BUILD)" == "debug" && "$(DEBUG_RUNTIME_LIBS)" == "default" __DEBUGRUNTIME_3 = d !endif !if "$(BUILD)" == "release" && "$(DEBUG_RUNTIME_LIBS)" == "default" __DEBUGRUNTIME_3 = !endif !if "$(DEBUG_RUNTIME_LIBS)" == "0" __DEBUGRUNTIME_3 = !endif !if "$(DEBUG_RUNTIME_LIBS)" == "1" __DEBUGRUNTIME_3 = d !endif !if "$(BUILD)" == "debug" __OPTIMIZEFLAG_4 = /Od !endif !if "$(BUILD)" == "release" __OPTIMIZEFLAG_4 = /O2 !endif !if "$(USE_THREADS)" == "0" __THREADSFLAG_7 = L !endif !if "$(USE_THREADS)" == "1" __THREADSFLAG_7 = T !endif !if "$(RUNTIME_LIBS)" == "dynamic" __RUNTIME_LIBS_8 = D !endif !if "$(RUNTIME_LIBS)" == "static" __RUNTIME_LIBS_8 = $(__THREADSFLAG_7) !endif !if "$(USE_RTTI)" == "0" __RTTIFLAG_9 = !endif !if "$(USE_RTTI)" == "1" __RTTIFLAG_9 = /GR !endif !if "$(USE_EXCEPTIONS)" == "0" __EXCEPTIONSFLAG_10 = !endif !if "$(USE_EXCEPTIONS)" == "1" __EXCEPTIONSFLAG_10 = /EHsc !endif !if "$(BUILD)" == "debug" && "$(DEBUG_RUNTIME_LIBS)" == "0" __NO_VC_CRTDBG_p = /D__NO_VC_CRTDBG__ !endif !if "$(BUILD)" == "release" && "$(DEBUG_FLAG)" == "1" __NO_VC_CRTDBG_p = /D__NO_VC_CRTDBG__ !endif !if "$(BUILD)" == "debug" && "$(DEBUG_RUNTIME_LIBS)" == "0" __NO_VC_CRTDBG_p_1 = /d __NO_VC_CRTDBG__ !endif !if "$(BUILD)" == "release" && "$(DEBUG_FLAG)" == "1" __NO_VC_CRTDBG_p_1 = /d __NO_VC_CRTDBG__ !endif !if "$(WXUNIV)" == "1" __WXUNIV_DEFINE_p = /D__WXUNIVERSAL__ !endif !if "$(WXUNIV)" == "1" __WXUNIV_DEFINE_p_1 = /d __WXUNIVERSAL__ !endif !if "$(BUILD)" == "debug" && "$(DEBUG_FLAG)" == "default" __DEBUG_DEFINE_p = /D__WXDEBUG__ !endif !if "$(DEBUG_FLAG)" == "1" __DEBUG_DEFINE_p = /D__WXDEBUG__ !endif !if "$(BUILD)" == "debug" && "$(DEBUG_FLAG)" == "default" __DEBUG_DEFINE_p_1 = /d __WXDEBUG__ !endif !if "$(DEBUG_FLAG)" == "1" __DEBUG_DEFINE_p_1 = /d __WXDEBUG__ !endif !if "$(USE_EXCEPTIONS)" == "0" __EXCEPTIONS_DEFINE_p = /DwxNO_EXCEPTIONS !endif !if "$(USE_EXCEPTIONS)" == "0" __EXCEPTIONS_DEFINE_p_1 = /d wxNO_EXCEPTIONS !endif !if "$(USE_RTTI)" == "0" __RTTI_DEFINE_p = /DwxNO_RTTI !endif !if "$(USE_RTTI)" == "0" __RTTI_DEFINE_p_1 = /d wxNO_RTTI !endif !if "$(USE_THREADS)" == "0" __THREAD_DEFINE_p = /DwxNO_THREADS !endif !if "$(USE_THREADS)" == "0" __THREAD_DEFINE_p_1 = /d wxNO_THREADS !endif !if "$(UNICODE)" == "1" __UNICODE_DEFINE_p = /D_UNICODE !endif !if "$(UNICODE)" == "1" __UNICODE_DEFINE_p_1 = /d _UNICODE !endif !if "$(MSLU)" == "1" __MSLU_DEFINE_p = /DwxUSE_UNICODE_MSLU=1 !endif !if "$(MSLU)" == "1" __MSLU_DEFINE_p_1 = /d wxUSE_UNICODE_MSLU=1 !endif !if "$(USE_GDIPLUS)" == "1" __GFXCTX_DEFINE_p = /DwxUSE_GRAPHICS_CONTEXT=1 !endif !if "$(USE_GDIPLUS)" == "1" __GFXCTX_DEFINE_p_1 = /d wxUSE_GRAPHICS_CONTEXT=1 !endif !if "$(SHARED)" == "1" __DLLFLAG_p = /DWXUSINGDLL !endif !if "$(SHARED)" == "1" __DLLFLAG_p_1 = /d WXUSINGDLL !endif !if "$(MONOLITHIC)" == "0" __WXLIB_ADV_p = \ wx$(PORTNAME)$(WXUNIVNAME)$(WX_RELEASE_NODOT)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)_adv.lib !endif !if "$(MONOLITHIC)" == "0" __WXLIB_HTML_p = \ wx$(PORTNAME)$(WXUNIVNAME)$(WX_RELEASE_NODOT)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)_html.lib !endif !if "$(MONOLITHIC)" == "0" __WXLIB_XML_p = \ wxbase$(WX_RELEASE_NODOT)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)_xml.lib !endif !if "$(MONOLITHIC)" == "0" __WXLIB_CORE_p = \ wx$(PORTNAME)$(WXUNIVNAME)$(WX_RELEASE_NODOT)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)_core.lib !endif !if "$(MONOLITHIC)" == "0" __WXLIB_BASE_p = \ wxbase$(WX_RELEASE_NODOT)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR).lib !endif !if "$(MONOLITHIC)" == "1" __WXLIB_MONO_p = \ wx$(PORTNAME)$(WXUNIVNAME)$(WX_RELEASE_NODOT)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR).lib !endif !if "$(USE_GUI)" == "1" __LIB_TIFF_p = wxtiff$(WXDEBUGFLAG).lib !endif !if "$(USE_GUI)" == "1" __LIB_JPEG_p = wxjpeg$(WXDEBUGFLAG).lib !endif !if "$(USE_GUI)" == "1" __LIB_PNG_p = wxpng$(WXDEBUGFLAG).lib !endif !if "$(MSLU)" == "1" __UNICOWS_LIB_p = unicows.lib !endif !if "$(USE_GDIPLUS)" == "1" __GDIPLUS_LIB_p = gdiplus.lib !endif
all: $(OBJS) $(OBJS): -if not exist $(OBJS) mkdir $(OBJS)
### Targets: ###
all: $(OBJS)\taskbar.exe
clean: -if exist $(OBJS)\*.obj del $(OBJS)\*.obj -if exist $(OBJS)\*.res del $(OBJS)\*.res -if exist $(OBJS)\*.pch del $(OBJS)\*.pch -if exist $(OBJS)\taskbar.exe del $(OBJS)\taskbar.exe -if exist $(OBJS)\taskbar.ilk del $(OBJS)\taskbar.ilk -if exist $(OBJS)\taskbar.pdb del $(OBJS)\taskbar.pdb
$(OBJS)\taskbar.exe: $(TASKBAR_OBJECTS) $(OBJS)\taskbar_sample.res link /NOLOGO /OUT:$@ $(LDFLAGS) $(__DEBUGINFO_1) $(LINK_TARGET_CPU) /LIBPATH:$(LIBDIRNAME) /SUBSYSTEM:WINDOWS @<< $(TASKBAR_OBJECTS) $(__WXLIB_ADV_p) $(__WXLIB_HTML_p) $(__WXLIB_XML_p) $(__WXLIB_CORE_p) $(__WXLIB_BASE_p) $(__WXLIB_MONO_p) $(__LIB_TIFF_p) $(__LIB_JPEG_p) $(__LIB_PNG_p) wxzlib$(WXDEBUGFLAG).lib wxregex$(WXUNICODEFLAG)$(WXDEBUGFLAG).lib wxexpat$(WXDEBUGFLAG).lib $(EXTRALIBS_FOR_BASE) $(__UNICOWS_LIB_p) $(__GDIPLUS_LIB_p) kernel32.lib user32.lib gdi32.lib comdlg32.lib winspool.lib winmm.lib shell32.lib comctl32.lib ole32.lib oleaut32.lib uuid.lib rpcrt4.lib advapi32.lib wsock32.lib odbc32.lib <<
$(OBJS)\taskbar_sample.res: .\..\..\samples\sample.rc rc /fo$@ /d WIN32 $(____DEBUGRUNTIME_2_p_1) $(__NO_VC_CRTDBG_p_1) /d __WXMSW__ $(__WXUNIV_DEFINE_p_1) $(__DEBUG_DEFINE_p_1) $(__EXCEPTIONS_DEFINE_p_1) $(__RTTI_DEFINE_p_1) $(__THREAD_DEFINE_p_1) $(__UNICODE_DEFINE_p_1) $(__MSLU_DEFINE_p_1) $(__GFXCTX_DEFINE_p_1) /i $(SETUPHDIR) /i .\..\..\include /i . $(__DLLFLAG_p_1) /d _WINDOWS /i .\..\..\samples $**
$(OBJS)\taskbar_tbtest.obj: .\tbtest.cpp $(CXX) /c /nologo /TP /Fo$@ $(TASKBAR_CXXFLAGS) $**
1.GetVersionEx
wince:GetVersionExW_OSVERSIONINFOW winnt:GetVersionExA_OSVERSIONINFOA, GetVersionExW_OSVERSIONINFOW, GetVersionExA_OSVERSIONINFOEXA, GetVersionExW_OSVERSIONINFOEXW win98:需unicode支持
实现的manifest文件如下: <?xml version="1.0" encoding="UTF-8" standalone="yes"?><assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"><assemblyIdentity version="1.0.0.0" processorArchitecture="X86" name="SWT.javaw" type="win32"/><description>Standard Widget Toolkit</description><dependency><dependentAssembly><assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="X86" publicKeyToken="6595b64144ccf1df" language="*"/></dependentAssembly></dependency></assembly>
如果编译后的exe文件名为:test.exe 那么新建:test.exe.manifest: <?xml version="2.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> <assemblyIdentity version="0.64.1.0" processorArchitecture="x86" name="Controls" type="win32" /> <description>wxWindows application</description> <dependency> <dependentAssembly> <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="X86" publicKeyToken="6595b64144ccf1df" language="*" /> </dependentAssembly> </dependency> </assembly>
我们只要在文件开头添加: # -*- coding: UTF-8 -*- 来指明文件的编码格式。在windows下最好用GBK.
在swt代码中有一个段:
#define OS_NATIVE(func) Java_org_eclipse_swt_internal_gtk_OS_##func
如果宏代替OS_NATIVE(foo),这样就会产生这样一个代替Java_org_eclipse_swt_internal_gtk_OS_foo. 非常实用!
|