C語言 常用API

MySQL的C語言API接口

1、首先當然是連接數據庫,函數原型如下:

MYSQL * STDCALL? mysql_real_connect(MYSQL *mysql, const char *host,
const char *user,
const char *passwd,
const char *db,
unsigned int port,
const char *unix_socket,
unsigned long clientflag);

第一個參數 MYSQL是 C api中一個非常重要的變量,里面內存非常豐富,有port,dbname,charset等連接基本參數。它也包含了一個叫 st_mysql_methods的結構體變量,該變量里面保存著很多函數指針,這些函數指針將會在數據庫連接成功以后的各種數據操作中被調用。mysql_real_connect函數中各參數,基本都是顧名思意。

2、連接數據庫成功之后就可以執行sql語句了使用mysql_query

int ?STDCALL ? mysql_query(MYSQL *mysql, const char *q);

第一個參數上面已經介紹過,第二個參數為要執行的sql語句。

這個函數總體就兩步:

(1)發送sql語句,其實就一個socket發送sql 語句,加上mysql固定的協議頭。懶的去看源碼了,抓了下包,如下:
0000? 19 00 00 00 0373 65 6c 65 63 74 20 61 70 70 5f? .....select app_
0010?? 6e 61 6d 65 20 66 72 6f 6d 20 61 70 70?????????? name from app
紅色部分是協議,前面兩位其實就是包的長度。具體協議沒研究過。

(2)然后就是接受結果,這里將會調用MYSQL變量中的st_mysql_methods中的read_query_result函數指針

3、獲取結果

sql執行完以后,如果是查詢語句,我們當然還要讀取數據,如果update,insert等語句,那么就看下操作成功與否即可。我們來看看如何獲取查詢結果: 如果 mysql_query返回成功,那么我們就通過mysql_store_result這個函數來讀取結果。原型如下:

MYSQL_RES? * STDCALL? mysql_store_result(MYSQL *mysql);

該函數會調用MYSQL變量中的st_mysql_methods中的 read_rows函數指針來獲取查詢的結果。同時該函數會返回MYSQL_RES 這樣一個變量,該變量主要用于保存查詢的結果。同時該函數malloc了一片內存空間來存儲查詢過來的數據,所以我們一定要記的 free(result),不然是肯定會造成內存泄漏的。 執行完mysql_store_result以后,其實數據都已經在MYSQL_RES 變量中了,下面的api基本就是讀取MYSQL_RES 中的數據。例如mysql_fetch_row這個函數,就是讀去查詢結果的一行。函數原型如下

MYSQL_ROW??? STDCALL? mysql_fetch_row(MYSQL_RES *result);

它會返回一個MYSQL_ROW變量,MYSQL_ROW其實就是char **.就當成一個二維數組來用吧。還有很多api,不再一一介紹,大部分信息都在MYSQL_RES MYSQL這兩個結構體中。具體可以參考mysql官方網站: http://dev.mysql.com/doc/refman/5.1/en/c.html 突然發現官方網站資料好全面,貌似比任何書都要好。

下面來個例子:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<mysql/mysql.h>
#define MAX_COLUMN_LEN??? 32
int main(int argc , char *argv[])
{
??? MYSQL my_connection;
??? MYSQL_RES *result;
??? MYSQL_ROW sql_row;
??? MYSQL_FIELD *fd;
??? char column[MAX_COLUMN_LEN][MAX_COLUMN_LEN];
??? int res;
??? mysql_init(&my_connection);
??? if(mysql_real_connect(&my_connection,"127.0.0.1","用戶","密碼","數據名稱",3306,NULL,0))
??? {
??????? perror("connect");
??????? res=mysql_query(&my_connection,"select * from app");//查詢
??????? if(!res)
??????? {
??????????? result=mysql_store_result(&my_connection);//保存查詢到的數據到result
??????????? if(result)
??????????? {
??????????????? int i,j;
??????????????? printf("the result number is %lu\n ",(unsigned long)mysql_num_rows(result));
??????????????? for(i=0;fd=mysql_fetch_field(result);i++)//獲取列名
??????????????? {
??????????????????? bzero(column[i],sizeof(column[i]));
??????????????????? strcpy(column[i],fd->name);
??????????????? }
??????????????? j=mysql_num_fields(result);
??????????????? for(i=0;i<j;i++)
??????????????? {
??????????????????? printf("%s\t",column[i]);
??????????????? }
??????????????? printf("\n");
??????????????? while(sql_row=mysql_fetch_row(result))//獲取具體的數據
??????????????? {
??????????????????? for(i=0;i<j;i++)
??????????????????? {
??????????????????????? printf("%s\t",sql_row[i]);
??????????????????? }
??????????????????? printf("\n");
??????????????? }
???????????????
??????????? }
??????? }
??????? else
??????? {
??????????? perror("select");
??????? }
??? }
??? else
??? {
??????? perror("connect:error");
??? }
??? mysql_free_result(MYSQL_RES *result);//釋放結果資源
??? mysql_close(&my_connection);//斷開連接

}
上面這個例子就是從一個表中查數據,然后輸出。 如果要insert或者update,只需要修改具體的sql既可。具體的操作都是通過mysql_query這個函數來搞定。 現在來講編譯的方法吧,這里我們需要.h以及.so庫。我們可以在 http://dev.mysql.com/downloads/connector/c/6.0.html 下載Connector/C。簡單的方法就是: 把里面include的東西拷貝到/usr/include/mysql/下面去,這樣編譯的時候就不需要加-I了,然后把lib下面的東西拷貝的/usr/lib/下去。

gcc具體的編譯方法:gcc ***.c -o *** -lmysqlclient

C語言日志和事務API—libjio

libjio是一個C庫做日志,交易為導向的I/O它提供了一個類UNIX的文件操作功能(如打開,讀取和寫入) ,這是裝在一個交易框架,以使文件操作可以提交或回滾是必要的。這是非侵入性,原子,和線程安全的,具有快速崩潰恢復。

示例代碼:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>
#include <libjio.h>

#define FILENAME "test1"
#define TEXT "Hello world!\n"

int main(void)
{
??? int r;
??? struct jfs file;
??? struct jtrans trans;
??? struct jfsck_result result;

??? /* check the file is OK */
??? jfsck(FILENAME, NULL, &result);
??? jfsck_cleanup(FILENAME, NULL);

??? /* and open it */
??? r = jopen(&file, FILENAME, O_RDWR | O_CREAT | O_TRUNC, 0600, 0);
??? if (r < 0) {
??????? perror("jopen");
??????? return 1;
??? }

??? /* write two "Hello world"s next to each other */
??? jtrans_init(&file, &trans);
??? jtrans_add(&trans, TEXT, strlen(TEXT), 0);
??? jtrans_add(&trans, TEXT, strlen(TEXT), strlen(TEXT));
??? r = jtrans_commit(&trans);
??? if (r < 0) {
??????? perror("jtrans_commit");
??????? return 1;
??? }

??? /* at this point the file has "Hello world!\nHello world!\n" */

??? /* now we rollback */
??? r = jtrans_rollback(&trans);
??? if (r < 0) {
??????? perror("jtrans_rollback");
??????? return 1;
??? }

??? /* and now the file is empty! */

??? jtrans_free(&trans);
??? jclose(&file);
??? return 0;
}

sqlite-C語言API介紹

在這一部分我將展示一些簡單的應用程序來說明SQLite的眾多特性。這些應用程序將在下面的一些子部分中展示,讓我們通過學習一個很簡單的應用程序來開始我們SQLite大陸的探險吧。下面的例子展示了一個典型的SQLite應用程序。它是一個使用SQLite API來處理一個SQLite數據庫文件的C程序。

這是一個典型的SQLite應用程序:
#include <stdio.h>
#include "sqlite3.h"
int main(void)
{
?? sqlite3*????? db = 0;
?? sqlite3_stmt* stmt = 0;
?? int retcode;
? ?retcode = sqlite3_open("MyDB", &db);
? ?if (retcode != SQLITE_OK){
? ?sqlite3_close(db);
? ?fprintf(stderr, "Could not open MyDB/n");
? ?return retcode;
?? }
?? retcode = sqlite3_prepare(db, "select SID from Students order by SID",?-1, &stmt, 0);
?? if (retcode != SQLITE_OK){
????? sqlite3_close(db);
????? fprintf(stderr, "Could not execute SELECT/n");
????? return retcode;
?? }
? ?while (sqlite3_step(stmt) == SQLITE_ROW){
????? int i = sqlite3_column_int(stmt, 0);
????? printf("SID = %d/n", i);
?? }
?? sqlite3_finalize(stmt);
?? sqlite3_close(db);
?? return SQLITE_OK;
}

你可以編譯上面的例子并且執行它。在這個文檔中顯示的示例輸出是在一個linux機器上獲得的,但是這些例子能夠在SQLite運行的其他的平臺上工作。這些例子假定你已經準備了可執行的sqlite3,libsqlite3.so(windows上是sqlite3.dll而Mac OS X上是libsqlite3.dylib)共享庫,和sqlite3.h接口定義文件。你可以從http://www.sqlite.org上獲取這些源代碼或二進制形式的文件。你會發現如果你將所有這三個(sqlite3, the shared library, 和sqlite3.h)和范例放在同一個目錄下處理該范例會比較容易。

舉個例子,假設你在一個Linux系統上,并且你將app1.c示例程序保存在libsqlite3.so , sqlite3和sqlite3.h同一個目錄下。你能夠通過執行這條命令編譯文件:gcc app1.c -o ./app1 -lsqlite3 -L.

它將會在當前工作的目錄下產生一個名為app1的二進制文件。你可以執行這個二進制文件來查看輸出。

注:SQLite源代碼和應用程序必須在同一個編譯器下編譯。

如果你已經將SQLite作為一個包安裝了,或者如果你的操作系統預安裝了SQlite,你可能需要使用一組不同的編譯參數。例如,在Ubuntu上,你可以通過命令sudo aptitude install sqlite3 libsqlite3-dev安裝SQLite,并且你可以使用命令cc app1.c -o ./app1 -lsqlite3來編譯應用程序。因為在現行的Mac OS X版本中包含SQLite,上述的相同的編譯命令也能工作。

這個應用程序打開了在當前工作目錄下的MyDB數據庫文件。這個數據庫需要至少一個表,命名為Students;這個表必須至少有一個整型列名為SID。在下一個例子中,你將會學習如何在數據庫中創建新的表,和如何在表中插入行(也被稱為元組和記錄),但是在目前,你可以使用這些命令創建并落戶表:

sqlite3 MyDB "create table students (SID integer)"
sqlite3 MyDB "insert into students values (200)"
sqlite3 MyDB "insert into students values (100)"
sqlite3 MyDB "insert into students values (300)"

如果你現在運行app1(在linux系統下要引入SQLite庫,,你可能需要在LD_LIBRARY_PATH環境變量中加入你的工作目錄名字,你將會看到下面的輸出:

SID = 100
SID = 200
SID = 300

注:在Linux,Unix和Mac OS X中,在命令提示符中鍵入app1的名字時,你可能需要前綴./

應用程序首先做好準備工作,接著執行SQL語句:select SID from Students order by SID。然后它進階到作為結果的行集,一個接一個的獲取SID的值,并且打印各個值。最后關閉數據庫。

SQLite是一個調用級別上的接口庫,它能夠嵌入到應用程序中。該庫將所有的SQLite API函數實現為C函數。所有的API函數都是以sqlite3_前綴命名,并且在sqlite3.h中聲明。在示例應用程序中使用了他們中的一部分,他們是sqlite3_open, sqlite3_prepare, sqlite3_step, sqlite3_column_int, sqlite3_finalize, 和 sqlite3_close。應用程序也采用了助記符常量,即用于API的返回比較值的SQLITE_OK 和 SQLITE_ROW。這些助記符在sqlite3.h中被定義。

1.1.1.1 sqlite3_open
?通過執行sqlite3_open函數,應用程序經由SQLite庫打開了一個到數據庫文件的新連接。(該應用程序可能有其他到相同的或者不同的數據庫的開放連接。SQLite清楚地處理這些連接,并且他們在SQLite注意前是相互間獨立的)。如果文件還不存在,SQLite將自動的創建數據庫文件。

注:在打開或創建一個文件時,SQLite遵守一個懶惰策略:知道該文件被閱讀訪問時才真正的打開或者創建。sqlite3_open函數經由一個形參(db,在前面的例子中)返回一個連接句柄(一個指向sqlite3類型的對象的指針),而句柄被用來支持在數據庫連接(因為這次打開連接)上的進一步操作。句柄表示了這次連接的完整情況。

1.1.1.2 sqlite3_prepare
sqlite3_prepare函數編譯了一個SQL語句,并且產生了一個等價的內部對象。這個對象在數據庫文法中作為一個準備語句被普遍的提及,在SQLite中他被實現為一個字節編碼程序。字節編碼程序是在虛擬機或者解釋器上運行的SQL語言的一個抽象表示。想要得到更多的信息,看后面的部分字節編碼編程語言。在本書中,我將交替使用條件字節編碼程序和準備語句。sqlite3_prepare函數經由一個形參(在前面例子中的stmt)返回一個狀態句柄(指向sqlite3_stmt類型對象的指針),該句柄被用來支持進一步的操作來操縱準備狀態。在這個示例程序中,我準備了select SID from Students order by SID語句作為stmt句柄。這個句柄動作起來就像一個開放的光標并且他被用來獲取SELECT語句返回的作為結果的行集,一次一行。

1.1.1.3 sqlite3_step

sqlite3_step函數將執行字節編碼程序直到它遇到折點(因為它已經計算了新的一行),或者直到它停止(沒有剩下的行了)。在之前的例子中,他返回了SQLITE_ROW,而在之后的例子中是SQLITE_DONE。因為有的SQL語句不返回行(例如UPDATE,INSERT,DELETE,和CREATE),當沒有行要處理時,他總是返回SQLITE_DONE。Step函數移動指針的位置來獲得SELECT語句的結果。初始的,指針指向輸出行集的第一行的前一位置。執行一次step函數,指針移動到了輸出行集的下一行。該指針只能向前移動。

1.1.1.4 sqlite3_column_int

如果step函數返回了SQLITE_ROW,你能夠通過執行sqlite3_column_*API函數來檢索每一列(也被認為是屬性或域)的值。SQL/SQLite和C語言中的阻抗(數據類型)的不匹配能夠被自動的處理:API在兩種語言間,將數據進行從存儲類型到請求類型的轉換。在示例應用中,每個輸出行是一個整型值,我們通過執行返回整型值的sqlite3_column_int函數來讀取的SID的值。

1.1.1.5 sqlite3_finalize

sqlite3_finalize函數銷毀準備好的狀態。也就是說,擦除字節編碼程序,并且釋放分配給狀態句柄的所有資源。句柄變為不可用。

1.1.1.6 sqlite3_close

sqlite3_close函數關閉數據庫連接,并且釋放了分配給該連接的所有資源。該連接句柄變為不可用。

1.1.1.7 其他有用的函數

其它被廣泛使用的API是sqlite3_bind_*和sqlite3_reset。在一個SQL語句字符串(輸入到sqlite3_prepare),一個或者多個文本值能夠被SQL參數標識?(或者?NNN,:AAA,@AAA或者$AAA,其中NNN是一個數字,而AAA是一個標示符)來代替。他們成為準備語句的輸入參數這些參數的值可以通過使用bind API函數來設置。如果一個參數沒有值約束,那么它不是取默認值,就是在沒有默認值被聲明的時候取SQL NULL。reset API函數通過一個異常將狀態句柄(例如,準備狀態)重置回它的初始狀態:所有有制約值的參數保持他們的原值。狀態準備被應用程序再一次的執行,并且在再執行過程中重用這些值。然而,應用程序可能會在它開始重新執行的前再一次的執行bind API獲得新值來代替前值。

1.1.1.8 返回值

? 所有的API函數返回0或者負整數值。SQLite推薦使用助記符來核對返回值。返回值SQLITE_OK表示成功。SQLITE_ROW表示sqlite3_step函數在SELECT語句返回的行集中找到了新的一行;SQLITE_DONE表示語句執行完成了。

c語言+API實現惡作劇程序

惡作劇一:鼠標禁錮:
#include<windows.h>
#pragma comment(linker,"/subsystem:\"Windows\" /entry:\"mainCRTStartup\"")
void main()
{
??????? int x,y;
??????? while(1)
??????? {
???????? x=1;
???????? y=1;
???????? SetCursorPos(x,y);
??????? }
??????? return ;
}

惡作劇二:鼠標亂抖:
#include<windows.h>
#include<stdio.h>
#pragma comment(linker,"/subsystem:\"Windows\" /entry:\"mainCRTStartup\"")
void main()
{
int x,y;?
while(1)
??????? {x=rand()%801;
???????? y=rand()%601;
???????? SetCursorPos(x,y);
??????? }
return ;
}

C語言API之文本和字體函數

C中與圖形有關的在#include "graphics.h"里面setcolor 顏色,可以用數字表示色彩。

AddFontResource:在Windows系統中添加一種字體資源
CreateFont :用指定的屬性創建一種邏輯字體
CreateFontIndirect: 用指定的屬性創建一種邏輯字體
CreateScalableFontResource:為一種TureType字體創建一個資源文件,以便能用API函數AddFontResource將其加入Windows系統
DrawText:將文本描繪到指定的矩形中
DrawTextEx與DrawText相似,只是加入了更多的功能
EnumFontFamilies:列舉指定設備可用的字體
EnumFontFamiliesEx:列舉指定設備可用的字體
EnumFonts:列舉指定設備可用的字體
ExtTextOut:經過擴展的文本描繪函數。也請參考SetTextAlign函數
GetAspectRatioFilterEx用SetMapperFlags要求Windows只選擇與設備當前縱橫比相符的光柵字體時,本函數可判斷縱橫比大小
GetCharABCWidths:判斷TureType字體中一個或多個字符的A-B-C大小
GetCharABCWidthsFloat:查詢一種字體中一個或多個字符的A-B-C尺寸
GetCharacterPlacement:該函數用于了解如何用一個給定的字符顯示一個字串
GetCharWidth:調查字體中一個或多個字符的寬度
GetFontData:接收一種可縮放字體文件的數據
GetFontLanguageInfo:返回目前選入指定設備場景中的字體的信息
GetGlyphOutline:取得TureType字體中構成一個字符的曲線信息
GetKerningPairs:取得指定字體的字距信息
GetOutlineTextMetrics:接收與TureType字體內部特征有關的詳細信息
GetRasterizerCaps:了解系統是否有能力支持可縮放的字體
GetTabbedTextExtent:判斷一個字串占據的范圍,同時考慮制表站擴充的因素
GetTextAlign:接收一個設備場景當前的文本對齊標志
GetTextCharacterExtra 判斷額外字符間距的當前值
GetTextCharset 接收當前選入指定設備場景的字體的字符集標識符
GetTextCharsetInfo 獲取與當前選定字體的字符集有關的詳細信息
GetTextColor 判斷當前字體顏色。通常也稱為“前景色”
GetTextExtentExPoint 判斷要填入指定區域的字符數量。也用一個數組裝載每個字符的范圍信息
GetTextExtentPoint 判斷一個字串的大小(范圍)
GetTextFace 獲取一種字體的字樣名
GetTextMetrics 獲取與選入一種設備場景的物理字體有關的信息
GrayString 描繪一個以灰色顯示的字串。通常由Windows用于標識禁止狀態
PolyTextOut 描繪一系列字串
RemoveFontResource 從Windows系統中刪除一種字體資源
SetMapperFlags Windows對字體進行映射時,可用該函數選擇與目標設備的縱橫比相符的光柵字體
SetTextAlign 設置文本對齊方式,并指定在文本輸出過程中使用設備場景的當前位置
SetTextCharacterExtra 描繪文本的時候,指定要在字符間插入的額外間距
SetTextColor 設置當前文本顏色。這種顏色也稱為“前景色”
SetTextJustification 通過指定一個文本行應占據的額外空間,可用這個函數對文本進行兩端對齊處理
TabbedTextOut 支持制表站的一個文本描繪函數
TextOut 文本繪圖函數??

一.C語言中字體的問題???
C語言中有兩種顯示方式,即文本方式和圖形方式。就我所知,只能在圖形方式下控制字體.???
先看一下C中定義的幾種字體???
??????????? 名稱???????????????? 索引值?????????? 字體說明???
??? DEFAULT_FONT???????????? 0?????? 8x8?? bit-mapped?? font???
??? TRIPLEX_FONT???????????? 1?????? Stroked?? triplex?? font???
??? SMALL_FONT???????????????? 2?????? Stroked?? small?? font???
??? SANS_SERIF_FONT?????? 3?????? Stroked?? sans-serif?? font???
??? GOTHIC_FONT?????????????? 4?????? Stroked?? gothic?? font??

C語言API—sqlite3的速度問題

在這里:http://web.utk.edu/~jplyon/sqlite/SQLite_optimization_FAQ.html#timing

大拿說道:The first thing you should know is that most of the time spent by SQLite (and most other DB systems) is on disk access, which is slow compared to memory operations.

我寫了個測試程序,意外的看到讀寫只是運行時占用資源的一個小頭,大頭被sqlite3_get_table()占了,請教是怎么回事?

/* 純凈版, 無出錯處理 */
??? 頭文件??? /
#include <stdio.h>
#include <sqlite3.h>
#include <time.h> /* for time */
#include <stdlib.h> /* for system */
#include <string.h> /* for memset strcpy */
//? 宏及結構體定義? ///
#define DB_FILE "test_0.1.db"

struct s_table1
{
??????? int id;
??????? int mark;
??????? char name[33];
??????? unsigned char type;
??????? char con[513];
};

?? 全局變量?? /
sqlite3 *db = NULL;
int ret = -1; /* 各函數返回值 */
?? 函數聲明?? /
void way01(); // 打開、關閉的影響
int createdb();
int insertdb();
int getdatas_no_oc1 ( sqlite3 *db, struct s_table1 *tb1 );
/???? 代碼??? /
int main ( void )
{
??????? int c = 0;
??????? ret = createdb();
??????? ret = insertdb();
??????? printf ( "createdb() -> createtable() -> insertdb() over\n" );
??????? printf ( "\n" );
??????? printf ( "1 : 打開、關閉的影響???????? ///\n" );
??????? while ( (c=getchar()) != 'q' )
??????? {
??????????????? switch (c)
??????????????? {
??????????????? case '1':
??????????????????????? way01(); // 打開、關閉的影響
??????????????????????? break;
??????????????? default:
??????????????????????? break;
??????????????? }
??????? }??
??????? system ( "rm -rf test_0.1.db" );
??????? return 0;
}

///
// 打開、關閉的影響
void way01()
{
??????? time_t tick1, tick2;
??????? int i = 0;
??????? int num = 100000;
??????? struct s_table1 tb_data;
??????? time ( &tick1 );
??????? for ( i=0; i<num; i++ )
??????? {
??????????????? ret = sqlite3_open ( DB_FILE, &db );
??????????????? sqlite3_close (db);
??????? }
??????? time ( &tick2 );
??????? printf("單純打開、關閉數據庫文件 100000 次, 時間為: %4ld s\n", tick2 - tick1 );
??????? time ( &tick1 );
??????? for ( i=0; i<num; i++ )
??????? {
??????????????? ret = sqlite3_open ( DB_FILE, &db );
??????????????? ret = getdatas_no_oc1 ( db, &tb_data );
??????????????? sqlite3_close (db);
??????? }
??????? time ( &tick2 );
??????? printf("打開、關閉并操作數據庫文件 100000 次, 時間為: %4ld s\n", tick2 - tick1 );
}
///
int createdb()
{
??????? system ( "rm -rf test_0.1.db" );
??????? char *sql1 = "CREATE TABLE table1 (id INTEGER, m INTEGER, n VARCHAR(32), t CHAR(1), con VARCHAR(512))";
??????? ret = sqlite3_open ( DB_FILE, &db );
??????? ret = sqlite3_exec ( db, sql1, NULL, NULL, NULL );
??????? sqlite3_close (db);
??????? return 0;
}
int insertdb()
{
??????? time_t ticks1, ticks2;
??????? int i = 0;
??????? int num = 1000;
??????? ret = sqlite3_open ( DB_FILE, &db );
??????? char *qf1 = "INSERT INTO table1 VALUES (%d, %d, %Q, %d, %Q)";
??????? char *sql = NULL;
??????? time ( &ticks1 );
??????? //下面是對所以插入進行手動提交, 這樣可以加快插入速度, 大于200倍
??????? sqlite3_exec ( db, "BEGIN", NULL, NULL, NULL );
??????? //插入num條記錄
??????? for (i=0;i<num;i++)
??????? {
??????????? sql = sqlite3_mprintf ( qf1, i, i*2, "goodc", i%(num/10), "test - varcharvarcharvarchar" );
??????????? ret = sqlite3_exec(db, sql, NULL, NULL, NULL);
??????????????? sqlite3_free (sql);
??????? }
??????? sqlite3_exec(db,"COMMIT",NULL,NULL,NULL);
??????? time ( &ticks2 );
??????? //printf ( "the time of insertdb is: %ld s\n", ticks2-ticks1 );
??????? sqlite3_close (db);
??????? return 0;
}
int getdatas_no_oc1 ( sqlite3 *db, struct s_table1 *tb1 )
{
??????? char *sql = "SELECT * FROM table1 WHERE id=500;";
??????? int row = 0;
??????? int column = 0;
??????? char **resultp = NULL;
??????? ret = sqlite3_get_table ( db, sql, &resultp, &row, &column, NULL );
??????? sqlite3_free_table(resultp);
??????? return 0;
}

利用win32 API寫文件

void WriteLog(CHAR csMsg[], DWORD dwSize )
{
HANDLE hFile;
DWORD dwNumberOfBytesWritten;
// 必須指定 OPEN_ALWAYS 標志, 否則不會在原文件內容上添加
hFile = CreateFile( _szFileName, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_HIDDEN,NULL );
if (hFile == INVALID_HANDLE_VALUE )
{
return ;
}
// 設置文件指針到文件結尾, 在 當前位置 FILE_END, 向后移動 0 字節
SetFilePointer( hFile , 0, NULL, FILE_END );
// 這個 API 是設置當前的位置為文件的結尾
// SetEndOfFile( hFile);
BOOL BRet = WriteFile( hFile, csMsg, dwSize , &dwNumberOfBytesWritten, NULL);
CloseHandle( hFile );
}

簡要的Windows API函數大全(1)

1. API之網絡函數

WNetAddConnection 創建同一個網絡資源的永久性連接
WNetAddConnection2 創建同一個網絡資源的連接
WNetAddConnection3 創建同一個網絡資源的連接
WNetCancelConnection 結束一個網絡連接
WNetCancelConnection2 結束一個網絡連接
WNetCloseEnum 結束一次枚舉操作
WNetConnectionDialog 啟動一個標準對話框,以便建立同網絡資源的連接
WNetDisconnectDialog 啟動一個標準對話框,以便斷開同網絡資源的連接
WNetEnumResource 枚舉網絡資源
WNetGetConnection 獲取本地或已連接的一個資源的網絡名稱
WNetGetLastError 獲取網絡錯誤的擴展錯誤信息
WNetGetUniversalName 獲取網絡中一個文件的遠程名稱以及/或者UNC(統一命名規范)名稱
WNetGetUser 獲取一個網絡資源用以連接的名字
WNetOpenEnum 啟動對網絡資源進行枚舉的過程

2. API之消息函數

BroadcastSystemMessage 將一條系統消息廣播給系統中所有的頂級窗口
GetMessagePos 取得消息隊列中上一條消息處理完畢時的鼠標指針屏幕位置
GetMessageTime 取得消息隊列中上一條消息處理完畢時的時間
PostMessage 將一條消息投遞到指定窗口的消息隊列
PostThreadMessage 將一條消息投遞給應用程序
RegisterWindowMessage 獲取分配給一個字串標識符的消息編號
ReplyMessage 答復一個消息
SendMessage 調用一個窗口的窗口函數,將一條消息發給那個窗口
SendMessageCallback 將一條消息發給窗口
SendMessageTimeout 向窗口發送一條消息
SendNotifyMessage 向窗口發送一條消息?

3. API之文件處理函數

CloseHandle 關閉一個內核對象。其中包括文件、文件映射、進程、線程、安全和同步對象等
CompareFileTime 對比兩個文件的時間
CopyFile 復制文件
CreateDirectory 創建一個新目錄
CreateFile 打開和創建文件、管道、郵槽、通信服務、設備以及控制臺
CreateFileMapping 創建一個新的文件映射對象
DeleteFile 刪除指定文件
DeviceIoControl 對設備執行指定的操作
DosDateTimeToFileTime 將DOS日期和時間值轉換成一個 win32 FILETIME 值
FileTimeToDosDateTime 將一個 win32 FILETIME 值轉換成DOS日期和時間值
FileTimeToLocalFileTime 將一個FILETIME結構轉換成本地時間
FileTimeToSystemTime 根據一個FILETIME結構的內容,裝載一個SYSTEMTIME結構
FindClose 關閉由FindFirstFile函數創建的一個搜索句柄
FindFirstFile 根據文件名查找文件
FindNextFile 根據調用FindFirstFile函數時指定的一個文件名查找下一個文件
FlushFileBuffers 針對指定的文件句柄,刷新內部文件緩沖區
FlushViewOfFile 將寫入文件映射緩沖區的所有數據都刷新到磁盤
GetBinaryType 判斷文件是否可以執行
GetCompressedFileSize 判斷一個壓縮文件在磁盤上實際占據的字節數
GetCurrentDirectory 在一個緩沖區中裝載當前目錄
GetDiskFreeSpace 獲取與一個磁盤的組織有關的信息,以及了解剩余空間的容量
GetDiskFreeSpaceEx 獲取與一個磁盤的組織以及剩余空間容量有關的信息
GetDriveType 判斷一個磁盤驅動器的類型
GetExpandedName 取得一個壓縮文件的全名
GetFileAttributes 判斷指定文件的屬性
GetFileInformationByHandle 這個函數提供了獲取文件信息的一種機制
GetFileSize 判斷文件長度
GetFileTime 取得指定文件的時間信息
GetFileType 在給出文件句柄的前提下,判斷文件類型
GetFileVersionInfo 從支持版本標記的一個模塊里獲取文件版本信息
GetFileVersionInfoSize 針對包含了版本資源的一個文件,判斷容納文件版本信息需要一個多大的緩沖區
GetFullPathName 獲取指定文件的完整路徑名
GetLogicalDrives 判斷系統中存在哪些邏輯驅動器字母
GetLogicalDriveStrings 獲取一個字串,其中包含了當前所有邏輯驅動器的根驅動器路徑
GetOverlappedResult 判斷一個重疊操作當前的狀態
GetPrivateProfileInt 為初始化文件(.ini文件)中指定的條目獲取一個整數值
GetPrivateProfileSection 獲取指定小節(在.ini文件中)所有項名和值的一個列表
GetPrivateProfileString 為初始化文件中指定的條目取得字串
GetProfileInt 取得win.ini初始化文件中指定條目的一個整數值
GetProfileSection 獲取指定小節(在win.ini文件中)所有項名和值的一個列表
GetProfileString 為win.ini初始化文件中指定的條目取得字串
GetShortPathName 獲取指定文件的短路徑名
GetSystemDirectory 取得Windows系統目錄(即System目錄)的完整路徑名
GetTempFileName 這個函數包含了一個臨時文件的名字,它可由應用程序使用
GetTempPath 獲取為臨時文件指定的路徑
GetVolumeInformation 獲取與一個磁盤卷有關的信息
GetWindowsDirectory 獲取Windows目錄的完整路徑名
hread 參考lread
hwrite 參考lwrite函數
lclose 關閉指定的文件
lcreat 創建一個文件
llseek 設置文件中進行讀寫的當前位置
LockFile 鎖定文件的某一部分,使其不與其他應用程序共享
LockFileEx 與LockFile相似,只是它提供了更多的功能
lopen 以二進制模式打開指定的文件
lread 將文件中的數據讀入內存緩沖區
lwrite 將數據從內存緩沖區寫入一個文件
LZClose 關閉由LZOpenFile 或 LZInit函數打開的一個文件
LZCopy 復制一個文件
LZInit 這個函數用于初始化內部緩沖區
LZOpenFile 該函數能執行大量不同的文件處理,而且兼容于壓縮文件
LZRead 將數據從文件讀入內存緩沖區
LZSeek 設置一個文件中進行讀寫的當前位置
MapViewOfFile 將一個文件映射對象映射到當前應用程序的地址空間
MoveFile 移動文件
OpenFile 這個函數能執行大量不同的文件操作
OpenFileMapping 打開一個現成的文件映射對象
QueryDosDevice 在Windows NT中,DOS設備名會映射成NT系統設備名。該函數可判斷當前的設備映射情況
ReadFile 從文件中讀出數據
ReadFileEx 與ReadFile相似,只是它只能用于異步讀操作,并包含了一個完整的回調
RegCloseKey 關閉系統注冊表中的一個項(或鍵)
RegConnectRegistry 訪問遠程系統的部分注冊表
RegCreateKey 在指定的項下創建或打開一個項
RegCreateKeyEx 在指定項下創建新項的更復雜的方式。在Win32環境中建議使用這個函數
RegDeleteKey 刪除現有項下方一個指定的子項
RegDeleteValue 刪除指定項下方的一個值
RegEnumKey 枚舉指定項的子項。在Win32環境中應使用RegEnumKeyEx
RegEnumKeyEx 枚舉指定項下方的子項
RegEnumValue 枚舉指定項的值
RegFlushKey 將對項和它的子項作出的改動實際寫入磁盤
RegGetKeySecurity 獲取與一個注冊表項有關的安全信息
RegLoadKey 從以前用RegSaveKey函數創建的一個文件里裝載注冊表信息
RegNotifyChangeKeyValue 注冊表項或它的任何一個子項發生變化時,用這個函數提供一種通知機制
RegOpenKey 打開一個現有的注冊表項
RegOpenKeyEx 打開一個現有的項。在win32下推薦使用這個函數
RegQueryInfoKey 獲取與一個項有關的信息
RegQueryValue 取得指定項或子項的默認(未命名)值
RegQueryValueEx 獲取一個項的設置值
RegReplaceKey 用一個磁盤文件保存的信息替換注冊表信息;并創建一個備份,在其中包含當前注冊表信息
RegRestoreKey 從一個磁盤文件恢復注冊表信息
RegSaveKey 將一個項以及它的所有子項都保存到一個磁盤文件
RegSetKeySecurity 設置指定項的安全特性
RegSetValue 設置指定項或子項的默認值
RegSetValueEx 設置指定項的值
RegUnLoadKey 卸載指定的項以及它的所有子項
RemoveDirectory 刪除指定目錄
SearchPath 查找指定文件
SetCurrentDirectory 設置當前目錄
SetEndOfFile 針對一個打開的文件,將當前文件位置設為文件末尾
SetFileAttributes 設置文件屬性
SetFilePointer 在一個文件中設置當前的讀寫位置
SetFileTime 設置文件的創建、訪問及上次修改時間
SetHandleCount 這個函數不必在win32下使用;即使使用,也不會有任何效果
SetVolumeLabel 設置一個磁盤的卷標(Label)
SystemTimeToFileTime 根據一個FILETIME結構的內容,載入一個SYSTEMTIME結構
UnlockFile 解除對一個文件的鎖定
UnlockFileEx 解除對一個文件的鎖定
UnmapViewOfFile 在當前應用程序的內存地址空間解除對一個文件映射對象的映射
VerFindFile 用這個函數決定一個文件應安裝到哪里
VerInstallFile 用這個函數安裝一個文件
VerLanguageName 這個函數能根據16位語言代碼獲取一種語言的名稱
VerQueryValue 這個函數用于從版本資源中獲取信息
WriteFile 將數據寫入一個文件
WriteFileEx 與WriteFile類似,只是它只能用于異步寫操作,并包括了一個完整的回調
WritePrivateProfileSection 為一個初始化文件(.ini)中指定的小節設置所有項名和值
WritePrivateProfileString 在初始化文件指定小節內設置一個字串
WriteProfileSection 為Win.ini初始化文件中一個指定的小節設置所有項名和值
WriteProfileString 在Win.ini初始化文件指定小節內設置一個字串

4. API之打印函數

AbortDoc 取消一份文檔的打印
AbortPrinter 刪除與一臺打印機關聯在一起的緩沖文件
AddForm 為打印機的表單列表添加一個新表單
AddJob 用于獲取一個有效的路徑名,以便用它為作業創建一個后臺打印文件。它也會為作業分配一個作業編號
AddMonitor 為系統添加一個打印機監視器
AddPort 啟動"添加端
AddPort 啟動"添加端口"對話框,允許用戶在系統可用端口列表中加入一個新端口
AddPrinter 在系統中添加一臺新打印機
AddPrinterConnection 連接指定的打印機
AddPrinterDriver 為指定的系統添加一個打印驅動程序
AddPrintProcessor 為指定的系統添加一個打印處理器
AddPrintProvidor 為系統添加一個打印供應商
AdvancedDocumentProperties 啟動打印機文檔設置對話框
ClosePrinter 關閉一個打開的打印機對象
ConfigurePort 針對指定的端口,啟動一個端口配置對話框
ConnectToPrinterDlg 啟動連接打印機對話框,用它同訪問網絡的打印機連接
DeleteForm 從打印機可用表單列表中刪除一個表單
DeleteMonitor 刪除指定的打印監視器
DeletePort 啟動"刪除端口"對話框,允許用戶從當前系統刪除一個端口
DeletePrinter 將指定的打印機標志為從系統中刪除
DeletePrinterConnection 刪除與指定打印機的連接
DeletePrinterDriver 從系統刪除一個打印機驅動程序
DeletePrintProcessor 從指定系統刪除一個打印處理器
DeletePrintProvidor 從系統中刪除一個打印供應商
DeviceCapabilities 利用這個函數可獲得與一個設備的能力有關的信息
DocumentProperties 打印機配置控制函數
EndDocAPI 結束一個成功的打印作業
EndDocPrinter 在后臺打印程序的級別指定一個文檔的結束
EndPage 用這個函數完成一個頁面的打印,并準備設備場景,以便打印下一個頁
EndPagePrinter 指定一個頁在打印作業中的結尾
EnumForms 枚舉一臺打印機可用的表單
EnumJobs 枚舉打印隊列中的作業
EnumMonitors 枚舉可用的打印監視器
EnumPorts 枚舉一個系統可用的端口
EnumPrinterDrivers 枚舉指定系統中已安裝的打印機驅動程序
EnumPrinters 枚舉系統中安裝的打印機
EnumPrintProcessorDatatypes 枚舉由一個打印處理器支持的數據類型
EnumPrintProcessors 枚舉系統中可用的打印處理器
Escape 設備控制函數
FindClosePrinterChangeNotification 關閉用FindFirstPrinterChangeNotification函數獲取的一個打印機通告對象
FindFirstPrinterChangeNotification 創建一個新的改變通告對象,以便我們注意打印機狀態的各種變化
FindNextPrinterChangeNotification 用這個函數判斷觸發一次打印機改變通告信號的原因
FreePrinterNotifyInfo 釋放由FindNextPrinterChangeNotification函數分配的一個緩沖區
GetForm 取得與指定表單有關的信息
GetJob 獲取與指定作業有關的信息
GetPrinter 取得與指定打印機有關的信息
GetPrinterData 為打印機設置注冊表配置信息
GetPrinterDriver 針對指定的打印機,獲取與打印機驅動程序有關的信息
GetPrinterDriverDirectory 判斷指定系統中包含了打印機驅動程序的目錄是什么
GetPrintProcessorDirectory 判斷指定系統中包含了打印機處理器驅動程序及文件的目錄
OpenPrinter 打開指定的打印機,并獲取打印機的句柄
PrinterMessageBox 在擁有指定打印作業的系統上顯示一個打印機出錯消息框
PrinterProperties 啟動打印機屬性對話框,以便對打印機進行配置
ReadPrinter 從打印機讀入數據
ResetDC 重設一個設備場景
ResetPrinter 改變指定打印機的默認數據類型及文檔設置
ScheduleJob 提交一個要打印的作業
SetAbortProc 為Windows指定取消函數的地址
SetForm 為指定的表單設置信息
SetJob 對一個打印作業的狀態進行控制
SetPrinter 對一臺打印機的狀態進行控制
SetPrinterData 設置打印機的注冊表配置信息
StartDoc 開始一個打印作業
StartDocPrinter 在后臺打印的級別啟動一個新文檔
StartPage 打印一個新頁前要先調用這個函數
StartPagePrinter 在打印作業中指定一個新頁的開始
WritePrinter 將發送目錄中的數據寫入打印機

5. API之文本和字體函數

AddFontResource 在Windows系統中添加一種字體資源
CreateFont 用指定的屬性創建一種邏輯字體
CreateFontIndirect 用指定的屬性創建一種邏輯字體
CreateScalableFontResource 為一種TureType字體創建一個資源文件,以便能用API函數AddFontResource將其加入Windows系統
DrawText 將文本描繪到指定的矩形中
DrawTextEx 與DrawText相似,只是加入了更多的功能
EnumFontFamilies 列舉指定設備可用的字體
EnumFontFamiliesEx 列舉指定設備可用的字體
EnumFonts 列舉指定設備可用的字體
ExtTextOut 經過擴展的文本描繪函數。也請參考SetTextAlign函數
GetAspectRatioFilterEx 用SetMapperFlags要求Windows只選擇與設備當前縱橫比相符的光柵字體時,本函數可判斷縱橫比大小
GetCharABCWidths 判斷TureType字體中一個或多個字符的A-B-C大小
GetCharABCWidthsFloat 查詢一種字體中一個或多個字符的A-B-C尺寸
GetCharacterPlacement 該函數用于了解如何用一個給定的字符顯示一個字串
GetCharWidth 調查字體中一個或多個字符的寬度
GetFontData 接收一種可縮放字體文件的數據
GetFontLanguageInfo 返回目前選入指定設備場景中的字體的信息
GetGlyphOutline 取得TureType字體中構成一個字符的曲線信息
GetKerningPairs 取得指定字體的字距信息
GetOutlineTextMetrics 接收與TureType字體內部特征有關的詳細信息
GetRasterizerCaps 了解系統是否有能力支持可縮放的字體
GetTabbedTextExtent 判斷一個字串占據的范圍,同時考慮制表站擴充的因素
GetTextAlign 接收一個設備場景當前的文本對齊標志
GetTextCharacterExtra 判斷額外字符間距的當前值
GetTextCharset 接收當前選入指定設備場景的字體的字符集標識符
GetTextCharsetInfo 獲取與當前選定字體的字符集有關的詳細信息
GetTextColor 判斷當前字體顏色。通常也稱為"前景色"
GetTextExtentExPoint 判斷要填入指定區域的字符數量。也用一個數組裝載每個字符的范圍信息
GetTextExtentPoint 判斷一個字串的大小(范圍)
GetTextFace 獲取一種字體的字樣名
GetTextMetrics 獲取與選入一種設備場景的物理字體有關的信息
GrayString 描繪一個以灰色顯示的字串。通常由Windows用于標識禁止狀態
PolyTextOut 描繪一系列字串
RemoveFontResource 從Windows系統中刪除一種字體資源
SetMapperFlags Windows對字體進行映射時,可用該函數選擇與目標設備的縱橫比相符的光柵字體
SetTextAlign 設置文本對齊方式,并指定在文本輸出過程中使用設備場景的當前位置
SetTextCharacterExtra 描繪文本的時候,指定要在字符間插入的額外間距
SetTextColor 設置當前文本顏色。這種顏色也稱為"前景色"
SetTextJustification 通過指定一個文本行應占據的額外空間,可用這個函數對文本進行兩端對齊處理
TabbedTextOut 支持制表站的一個文本描繪函數
TextOut 文本繪圖函數

6. API之菜單函數

AppendMenu 在指定的菜單里添加一個菜單項
CheckMenuItem 復選或撤消復選指定的菜單條目
CheckMenuRadioItem 指定一個菜單條目被復選成"單選"項目
CreateMenu 創建新菜單
CreatePopupMenu 創建一個空的彈出式菜單
DeleteMenu 刪除指定的菜單條目
DestroyMenu 刪除指定的菜單
DrawMenuBar 為指定的窗口重畫菜單
EnableMenuItem 允許或禁止指定的菜單條目
GetMenu 取得窗口中一個菜單的句柄
GetMenuCheckMarkDimensions 返回一個菜單復選符的大小
GetMenuContextHelpId 取得一個菜單的幫助場景ID
GetMenuDefaultItem 判斷菜單中的哪個條目是默認條目
GetMenuItemCount 返回菜單中條目(菜單項)的數量
GetMenuItemID 返回位于菜單中指定位置處的條目的菜單ID
GetMenuItemInfo 取得(接收)與一個菜單條目有關的特定信息
GetMenuItemRect 在一個矩形中裝載指定菜單條目的屏幕坐標信息
GetMenuState 取得與指定菜單條目狀態有關的信息
GetMenuString 取得指定菜單條目的字串
GetSubMenu 取得一個彈出式菜單的句柄,它位于菜單中指定的位置
GetSystemMenu 取得指定窗口的系統菜單的句柄
HiliteMenuItem 控制頂級菜單條目的加亮顯示狀態
InsertMenu 在菜單的指定位置處插入一個菜單條目,并根據需要將其他條目向下移動
InsertMenuItem 插入一個新菜單條目
IsMenu 判斷指定的句柄是否為一個菜單的句柄
LoadMenu 從指定的模塊或應用程序實例中載入一個菜單
LoadMenuIndirect 載入一個菜單
MenuItemFromPoint 判斷哪個菜單條目包含了屏幕上一個指定的點
ModifyMenu 改變菜單條目
RemoveMenu 刪除指定的菜單條目
SetMenu 設置窗口菜單
SetMenuContextHelpId 設置一個菜單的幫助場景ID
SetMenuDefaultItem 將一個菜單條目設為默認條目
SetMenuItemBitmaps 設置一幅特定位圖,令其在指定的菜單條目中使用,代替標準的復選符號(√)
SetMenuItemInfo 為一個菜單條目設置指定的信息
TrackPopupMenu 在屏幕的任意地方顯示一個彈出式菜單
TrackPopupMenuEx 與TrackPopupMenu相似,只是它提供了額外的功能

簡要的Windows API函數大全(2)

7. API之位圖、圖標和光柵運算函數

BitBlt 將一幅位圖從一個設備場景復制到另一個
CopyIcon 制作指定圖標或鼠標指針的一個副本。這個副本從屬于發出調用的應用程序
CopyImage 復制位圖、圖標或指針,同時在復制過程中進行一些轉換工作
CreateBitmap 按照規定的格式創建一幅與設備有關位圖
CreateBitmapIndirect 創建一幅與設備有關位圖
CreateCompatibleBitmap 創建一幅與設備有關位圖,它與指定的設備場景兼容
CreateCursor 創建一個鼠標指針
CreateDIBitmap 根據一幅與設備無關的位圖創建一幅與設備有關的位圖
CreateDIBSection 創建一個DIBSection
CreateIcon 創建一個圖標
CreateIconIndirect 創建一個圖標
DestroyCursor 清除指定的鼠標指針,并釋放它占用的所有系統資源
DestroyIcon 清除圖標
DrawIcon 在指定的位置畫一個圖標
DrawIconEx 描繪一個圖標或鼠標指針。與DrawIcon相比,這個函數提供了更多的功能
ExtractAssociatedIcon 判斷一個可執行程序或DLL中是否存在圖標,或是否有圖標與系統注冊表中指定的文件存在關聯并提取之
ExtractIcon 判斷一個可執行文件或DLL中是否有圖標存在,并將其提取出來
GetBitmapBits 將來自位圖的二進制位復制到一個緩沖區
GetBitmapDimensionEx 取得一幅位圖的寬度和高度
GetDIBColorTable 從選入設備場景的DIBSection中取得顏色表信息
GetDIBits 將來自一幅位圖的二進制位復制到一幅與設備無關的位圖里
GetIconInfo 取得與圖標有關的信息
GetStretchBltMode 判斷StretchBlt 和 StretchDIBits函數采用的伸縮模式
LoadBitmap 從指定的模塊或應用程序實例中載入一幅位圖
LoadCursor 從指定的模塊或應用程序實例中載入一個鼠標指針
LoadCursorFromFile 在一個指針文件或一個動畫指針文件的基礎上創建一個指針
LoadIcon 從指定的模塊或應用程序實例中載入一個圖標
LoadImage 載入一個位圖、圖標或指針
MaskBlt 執行復雜的圖象傳輸,同時進行掩模(MASK)處理
PatBlt 在當前選定的刷子的基礎上,用一個圖案填充指定的設備場景
PlgBlt 復制一幅位圖,同時將其轉換成一個平行四邊形。利用它可對位圖進行旋轉處理
SetBitmapBits 將來自緩沖區的二進制位復制到一幅位圖
SetBitmapDimensionEx 設置一幅位圖的寬度。以一毫米的十分之一為單位
SetDIBColorTable 設置選入設備場景的一個DIBSection的顏色表信息
SetDIBits 將來自與設備無關位圖的二進制位復制到一幅與設備有關的位圖里
SetDIBitsToDevice 將一幅與設備無關位圖的全部或部分數據直接復制到一個設備
SetStretchBltMode 指定StretchBlt 和 StretchDIBits函數的伸縮模式
StretchBlt 將一幅位圖從一個設備場景復制到另一個
StretchDIBits 將一幅與設備無關位圖的全部或部分數據直接復制到指定的設備場景

8. API之繪圖函數

AbortPath 拋棄選入指定設備場景中的所有路徑。也取消目前正在進行的任何路徑的創建工作
AngleArc 用一個連接弧畫一條線
Arc 畫一個圓弧
BeginPath 啟動一個路徑分支
CancelDC 取消另一個線程里的長時間繪圖操作
Chord 畫一個弦
CloseEnhMetaFile 關閉指定的增強型圖元文件設備場景,并將新建的圖元文件返回一個句柄
CloseFigure 描繪到一個路徑時,關閉當前打開的圖形
CloseMetaFile 關閉指定的圖元文件設備場景,并向新建的圖元文件返回一個句柄
CopyEnhMetaFile 制作指定增強型圖元文件的一個副本(拷貝)
CopyMetaFile 制作指定(標準)圖元文件的一個副本
CreateBrushIndirect 在一個LOGBRUSH數據結構的基礎上創建一個刷子
CreateDIBPatternBrush 用一幅與設備無關的位圖創建一個刷子,以便指定刷子樣式(圖案)
CreateEnhMetaFile 創建一個增強型的圖元文件設備場景
CreateHatchBrush 創建帶有陰影圖案的一個刷子
CreateMetaFile 創建一個圖元文件設備場景
CreatePatternBrush 用指定了刷子圖案的一幅位圖創建一個刷子
CreatePen 用指定的樣式、寬度和顏色創建一個畫筆
CreatePenIndirect 根據指定的LOGPEN結構創建一個畫筆
CreateSolidBrush 用純色創建一個刷子
DeleteEnhMetaFile 刪除指定的增強型圖元文件
DeleteMetaFile 刪除指定的圖元文件
DeleteObject 刪除GDI對象,對象使用的所有系統資源都會被釋放
DrawEdge 用指定的樣式描繪一個矩形的邊框
DrawEscape 換碼(Escape)函數將數據直接發至顯示設備驅動程序
DrawFocusRect 畫一個焦點矩形
DrawFrameControl 描繪一個標準控件
DrawState 為一幅圖象或繪圖操作應用各式各樣的效果
Ellipse 描繪一個橢圓,由指定的矩形圍繞
EndPath 停止定義一個路徑
EnumEnhMetaFile 針對一個增強型圖元文件,列舉其中單獨的圖元文件記錄
EnumMetaFile 為一個標準的windows圖元文件枚舉單獨的圖元文件記錄
EnumObjects 枚舉可隨同指定設備場景使用的畫筆和刷子
ExtCreatePen 創建一個擴展畫筆(裝飾或幾何)
ExtFloodFill 在指定的設備場景里,用當前選擇的刷子填充一個區域
FillPath 關閉路徑中任何打開的圖形,并用當前刷子填充
FillRect 用指定的刷子填充一個矩形
FlattenPath 將一個路徑中的所有曲線都轉換成線段
FloodFill 用當前選定的刷子在指定的設備場景中填充一個區域
FrameRect 用指定的刷子圍繞一個矩形畫一個邊框
GdiComment 為指定的增強型圖元文件設備場景添加一條注釋信息
GdiFlush 執行任何未決的繪圖操作
GdiGetBatchLimit 判斷有多少個GDI繪圖命令位于隊列中
GdiSetBatchLimit 指定有多少個GDI繪圖命令能夠進入隊列
GetArcDirection 畫圓弧的時候,判斷當前采用的繪圖方向
GetBkColor 取得指定設備場景當前的背景顏色
GetBkMode 針對指定的設備場景,取得當前的背景填充模式
GetBrushOrgEx 判斷指定設備場景中當前選定刷子起點
GetCurrentObject 獲得指定類型的當前選定對象
GetCurrentPositionEx 在指定的設備場景中取得當前的畫筆位置
GetEnhMetaFile 取得磁盤文件中包含的一個增強型圖元文件的圖元文件句柄
GetEnhMetaFileBits 將指定的增強型圖元文件復制到一個內存緩沖區里
GetEnhMetaFileDescription 返回對一個增強型圖元文件的說明
GetEnhMetaFileHeader 取得增強型圖元文件的圖元文件頭
GetEnhMetaFilePaletteEntries 取得增強型圖元文件的全部或部分調色板
GetMetaFile 取得包含在一個磁盤文件中的圖元文件的圖元文件句柄
GetMetaFileBitsEx 將指定的圖元文件復制到一個內存緩沖區
GetMiterLimit 取得設備場景的斜率限制(Miter)設置
GetNearestColor 根據設備的顯示能力,取得與指定顏色最接近的一種純色
GetObjectAPI 取得對指定對象進行說明的一個結構
GetObjectType 判斷由指定句柄引用的GDI對象的類型
GetPath 取得對當前路徑進行定義的一系列數據
GetPixel 在指定的設備場景中取得一個像素的RGB值
GetPolyFillMode 針對指定的設備場景,獲得多邊形填充模式
GetROP2 針對指定的設備場景,取得當前的繪圖模式
GetStockObject 取得一個固有對象(Stock)
GetSysColorBrush 為任何一種標準系統顏色取得一個刷子
GetWinMetaFileBits 通過在一個緩沖區中填充用于標準圖元文件的數據,將一個增強型圖元文件轉換成標準windows圖元文件
InvertRect 通過反轉每個像素的值,從而反轉一個設備場景中指定的矩形
LineDDA 枚舉指定線段中的所有點
LineTo 用當前畫筆畫一條線,從當前位置連到一個指定的點
MoveToEx 為指定的設備場景指定一個新的當前畫筆位置
PaintDesk 在指定的設備場景中描繪桌面墻紙圖案
PathToRegion 將當前選定的路徑轉換到一個區域里
Pie 畫一個餅圖
PlayEnhMetaFile 在指定的設備場景中畫一個增強型圖元文件
PlayEnhMetaFileRecord 回放單獨一條增強型圖元文件記錄
PlayMetaFile 在指定的設備場景中回放一個圖元文件
PlayMetaFileRecord 回放來自圖元文件的單條記錄
PolyBezier 描繪一條或多條貝塞爾(Bezier)曲線
PolyDraw 描繪一條復雜的曲線,由線段及貝塞爾曲線組成
Polygon 描繪一個多邊形
Polyline 用當前畫筆描繪一系列線段
PolyPolygon 用當前選定畫筆描繪兩個或多個多邊形
PolyPolyline 用當前選定畫筆描繪兩個或多個多邊形
Rectangle 用當前選定的畫筆描繪矩形,并用當前選定的刷子填充
RoundRect 用當前選定的畫筆畫一個圓角矩形,并用當前選定的刷子在其中填充
SelectClipPath 將設備場景當前的路徑合并到剪切區域里
SelectObject 為當前設備場景選擇圖形對象
SetArcDirection 設置圓弧的描繪方向
SetBkColor 為指定的設備場景設置背景顏色
SetBkMode 指定陰影刷子、虛線畫筆以及字符中的空隙的填充方式
SetBrushOrgEx 為指定的設備場景設置當前選定刷子的起點
SetEnhMetaFileBits 用指定內存緩沖區內包含的數據創建一個增強型圖元文件
SetMetaFileBitsEx 用包含在指定內存緩沖區內的數據結構創建一個圖元文件
SetMiterLimit 設置設備場景當前的斜率限制
SetPixel 在指定的設備場景中設置一個像素的RGB值
SetPixelV 在指定的設備場景中設置一個像素的RGB值
SetPolyFillMode 設置多邊形的填充模式
SetROP2 設置指定設備場景的繪圖模式。與vb的DrawMode屬性完全一致
SetWinMetaFileBits 將一個標準Windows圖元文件轉換成增強型圖元文件
StrokeAndFillPath 針對指定的設備場景,關閉路徑上打開的所有區域
StrokePath 用當前畫筆描繪一個路徑的輪廓。打開的圖形不會被這個函數關閉
UnrealizeObject 將一個刷子對象選入設備場景之前,如刷子的起點準備用SetBrushOrgEx修改,則必須先調用本函數
WidenPath 根據選定畫筆的寬度,重新定義當前選定的路徑

9. API之設備場景函數

CombineRgn 將兩個區域組合為一個新區域
CombineTransform 驅動世界轉換。它相當于依順序進行兩次轉換
CreateCompatibleDC 創建一個與特定設備場景一致的內存設備場景
CreateDC 為專門設備創建設備場景
CreateEllipticRgn 創建一個橢圓
CreateEllipticRgnIndirect 創建一個內切于特定矩形的橢圓區域
CreateIC 為專用設備創建一個信息場景
CreatePolygonRgn 創建一個由一系列點圍成的區域
CreatePolyPolygonRgn 創建由多個多邊形構成的區域。每個多邊形都應是封閉的
CreateRectRgn 創建一個矩形區域
CreateRectRgnIndirect 創建一個矩形區域
CreateRoundRectRgn 創建一個圓角矩形
DeleteDC 刪除專用設備場景或信息場景,釋放所有相關窗口資源
DPtoLP 將點陣從設備坐標轉換到專用設備場景邏輯坐標
EqualRgn 確定兩個區域是否相等
ExcludeClipRect 從專用設備場景的剪裁區中去掉一個矩形區。矩形內不能進行繪圖
ExcludeUpdateRgn 從專用設備場景剪裁區去掉指定窗口的刷新區域
ExtCreateRegion 根據世界轉換修改區域
ExtSelectClipRgn 將指定區域組合到設備場景的當前剪裁區
FillRgn 用指定刷子填充指定區域
FrameRgn 用指定刷子圍繞指定區域畫一個外框
GetBoundsRect 獲取指定設備場景的邊界矩形
GetClipBox 獲取完全包含指定設備場景剪裁區的最小矩形
GetClipRgn 獲取設備場景當前剪裁區
GetDC 獲取指定窗口的設備場景
GetDCEx 為指定窗口獲取設備場景。相比GetDC,本函數提供了更多的選項
GetDCOrgEx 獲取指定設備場景起點位置(以屏幕坐標表示)
GetDeviceCaps 根據指定設備場景代表的設備的功能返回信息
GetGraphicsMode 確定是否允許增強圖形模式(世界轉換)
GetMapMode 為特定設備場景調入映象模式
GetRegionData 裝入描述一個區域信息的RgnData結構或緩沖區
GetRgnBox 獲取完全包含指定區域的最小矩形
GetUpdateRgn 確定指定窗口的刷新區域。該區域當前無效,需要刷新
GetViewportExtEx 獲取設備場景視口(viewport)范圍
GetViewportOrgEx 獲取設備場景視口起點
GetWindowDC 獲取整個窗口(包括邊框、滾動條、標題欄、菜單等)的設備場景
GetWindowExtEx 獲取指定設備場景的窗口范圍
GetWindowOrgEx 獲取指定設備場景的邏輯窗口的起點
GetWindowRgn 獲取窗口區域
GetWorldTransform 如果有世界轉換,為設備場景獲取當前世界轉換
IntersectClipRect 為指定設備定義一個新的剪裁區
InvalidateRgn 使窗口指定區域不活動,并將它加入窗口刷新區,使之可隨后被重畫
InvertRgn 通過顛倒每個像素值反轉設備場景指定區域
LPtoDP 將點陣從指定設備場景邏輯坐標轉換為設備坐標
ModifyWorldTransform 根據指定的模式修改世界轉換
OffsetClipRgn 按指定量平移設備場景剪裁區
OffsetRgn 按指定偏移量平移指定區域
OffsetViewportOrgEx 平移設備場景視口區域
OffsetWindowOrgEx 平移指定設備場景窗口起點
PaintRgn 用當前刷子背景色填充指定區域
PtInRegion 確定點是否在指定區域內
PtVisible 確定指定點是否可見(即,點是否在設備場景剪裁區內)
RectInRegion 確定矩形是否有部分在指定區域內
RectVisible 確定指定矩形是否有部分可見(是否在設備場景剪裁區內)
ReleaseDC 釋放由調用GetDC或GetWindowDC函數獲取的指定設備場景
RestoreDC 從設備場景堆棧恢復一個原先保存的設備場景
SaveDC 將指定設備場景狀態保存到Windows設備場景堆棧
ScaleViewportExtEx 縮放設備場景視口的范圍
ScaleWindowExtEx 縮放指定設備場景窗口范圍
ScrollDC 在窗口(由設備場景代表)中水平和(或)垂直滾動矩形
SelectClipRgn 為指定設備場景選擇新的剪裁區
SetBoundsRect 設置指定設備場景的邊界矩形
SetGraphicsMode 允許或禁止增強圖形模式,以提供某些支持(包括世界轉換)
SetMapMode 設置指定設備場景的映射模式
SetRectRgn 設置區域為指定的矩形
SetViewportExtEx 設置設備場景視口范圍
SetViewportOrgEx 設置設備場景視口起點
SetWindowExtEx 設置指定設備場景窗口范圍
SetWindowOrgEx 設置指定設備場景窗口起點
SetWindowRgn 設置窗口區域
SetWorldTransform 設置世界轉換
ValidateRgn 激活窗口中指定區域,把它從刷新區移走
WindowFromDC 取回與某一設備場景相關的窗口的句柄

10. API之硬件與系統函數

ActivateKeyboardLayout 激活一個新的鍵盤布局。鍵盤布局定義了按鍵在一種物理性鍵盤上的位置與含義
Beep 用于生成簡單的聲音
CharToOem 將一個字串從ANSI字符集轉換到OEM字符集
ClipCursor 將指針限制到指定區域
ConvertDefaultLocale 將一個特殊的地方標識符轉換成真實的地方ID
CreateCaret 根據指定的信息創建一個插入符(光標),并將它選定為指定窗口的默認插入符
DestroyCaret 清除(破壞)一個插入符
EnumCalendarInfo 枚舉在指定"地方"環境中可用的日歷信息
EnumDateFormats 列舉指定的"當地"設置中可用的長、短日期格式
EnumSystemCodePages 枚舉系統中已安裝或支持的代碼頁
EnumSystemLocales 枚舉系統已經安裝或提供支持的"地方"設置
EnumTimeFormats 枚舉一個指定的地方適用的時間格式
ExitWindowsEx 退出windows,并用特定的選項重新啟動
ExpandEnvironmentStrings 擴充環境字串
FreeEnvironmentStrings 翻譯指定的環境字串塊
GetACP 判斷目前正在生效的ANSI代碼頁
GetAsyncKeyState 判斷函數調用時指定虛擬鍵的狀態
GetCaretBlinkTime 判斷插入符光標的閃爍頻率
GetCaretPos 判斷插入符的當前位置
GetClipCursor 取得一個矩形,用于描述目前為鼠標指針規定的剪切區域
GetCommandLine 獲得指向當前命令行緩沖區的一個指針
GetComputerName 取得這臺計算機的名稱
GetCPInfo 取得與指定代碼頁有關的信息
GetCurrencyFormat 針對指定的"地方"設置,根據貨幣格式格式化一個數字
GetCursor 獲取目前選擇的鼠標指針的句柄
GetCursorPos 獲取鼠標指針的當前位置
GetDateFormat 針對指定的"當地"格式,對一個系統日期進行格式化
GetDoubleClickTime 判斷連續兩次鼠標單擊之間會被處理成雙擊事件的間隔時間
GetEnvironmentStrings 為包含了當前環境字串設置的一個內存塊分配和返回一個句柄
GetEnvironmentVariable 取得一個環境變量的值
GetInputState 判斷是否存在任何待決(等待處理)的鼠標或鍵盤事件
GetKBCodePage 由GetOEMCP取代,兩者功能完全相同
GetKeyboardLayout 取得一個句柄,描述指定應用程序的鍵盤布局
GetKeyboardLayoutList 獲得系統適用的所有鍵盤布局的一個列表
GetKeyboardLayoutName 取得當前活動鍵盤布局的名稱
GetKeyboardState 取得鍵盤上每個虛擬鍵當前的狀態
GetKeyboardType 了解與正在使用的鍵盤有關的信息
GetKeyNameText 在給出掃描碼的前提下,判斷鍵名
GetKeyState 針對已處理過的按鍵,在最近一次輸入信息時,判斷指定虛擬鍵的狀態
GetLastError 針對之前調用的api函數,用這個函數取得擴展錯誤信息
GetLocaleInfo 取得與指定"地方"有關的信息
GetLocalTime 取得本地日期和時間
GetNumberFormat 針對指定的"地方",按特定的格式格式化一個數字
GetOEMCP 判斷在OEM和ANSI字符集間轉換的windows代碼頁
GetQueueStatus 判斷應用程序消息隊列中待決(等待處理)的消息類型
GetSysColor 判斷指定windows顯示對象的顏色
GetSystemDefaultLangID 取得系統的默認語言ID
GetSystemDefaultLCID 取得當前的默認系統"地方"
GetSystemInfo 取得與底層硬件平臺有關的信息
GetSystemMetrics 返回與windows環境有關的信息
GetSystemPowerStatus 獲得與當前系統電源狀態有關的信息
GetSystemTime 取得當前系統時間,這個時間采用的是"協同世界時間"(即UTC,也叫做GMT)格式
GetSystemTimeAdjustment 使內部系統時鐘與一個外部的時鐘信號源同步
GetThreadLocale 取得當前線程的地方ID
GetTickCount 用于獲取自windows啟動以來經歷的時間長度(毫秒)
GetTimeFormat 針對當前指定的"地方",按特定的格式格式化一個系統時間
GetTimeZoneInformation 取得與系統時區設置有關的信息
GetUserDefaultLangID 為當前用戶取得默認語言ID
GetUserDefaultLCID 取得當前用戶的默認"地方"設置
GetUserName 取得當前用戶的名字
GetVersion 判斷當前運行的Windows和DOS版本
GetVersionEx 取得與平臺和操作系統有關的版本信息
HideCaret 在指定的窗口隱藏插入符(光標)
IsValidCodePage 判斷一個代碼頁是否有效
IsValidLocale 判斷地方標識符是否有效
keybd_event 這個函數模擬了鍵盤行動
LoadKeyboardLayout 載入一個鍵盤布局
MapVirtualKey 根據指定的映射類型,執行不同的掃描碼和字符轉換
MapVirtualKeyEx 根據指定的映射類型,執行不同的掃描碼和字符轉換
MessageBeep 播放一個系統聲音。系統聲音的分配方案是在控制面板里決定的
mouse_event 模擬一次鼠標事件
OemKeyScan 判斷OEM字符集中的一個ASCII字符的掃描碼和Shift鍵狀態
OemToChar 將OEM字符集的一個字串轉換到ANSI字符集
SetCaretBlinkTime 指定插入符(光標)的閃爍頻率
SetCaretPos 指定插入符的位置
SetComputerName 設置新的計算機名
SetCursor 將指定的鼠標指針設為當前指針
SetCursorPos 設置指針的位置
SetDoubleClickTime 設置連續兩次鼠標單擊之間能使系統認為是雙擊事件的間隔時間
SetEnvironmentVariable 將一個環境變量設為指定的值
SetKeyboardState 設置每個虛擬鍵當前在鍵盤上的狀態
SetLocaleInfo 改變用戶"地方"設置信息
SetLocalTime 設置當前地方時間
SetSysColors 設置指定窗口顯示對象的顏色
SetSystemCursor 改變任何一個標準系統指針
SetSystemTime 設置當前系統時間
SetSystemTimeAdjustment 定時添加一個校準值使內部系統時鐘與一個外部的時鐘信號源同步
SetThreadLocale 為當前線程設置地方
SetTimeZoneInformation 設置系統時區信息
ShowCaret 在指定的窗口里顯示插入符(光標)
ShowCursor 控制鼠標指針的可視性
SwapMouseButton 決定是否互換鼠標左右鍵的功能
SystemParametersInfo 獲取和設置數量眾多的windows系統參數
SystemTimeToTzSpecificLocalTime 將系統時間轉換成地方時間
ToAscii 根據當前的掃描碼和鍵盤信息,將一個虛擬鍵轉換成ASCII字符
ToUnicode 根據當前的掃描碼和鍵盤信息,將一個虛擬鍵轉換成Unicode字符
UnloadKeyboardLayout 卸載指定的鍵盤布局
VkKeyScan 針對Windows字符集中一個ASCII字符,判斷虛擬鍵碼和Shift鍵的狀態

11. API之進程和線程函數

CancelWaitableTimer 這個函數用于取消一個可以等待下去的計時器操作
CallNamedPipe 這個函數由一個希望通過管道通信的一個客戶進程調用
ConnectNamedPipe 指示一臺服務器等待下去,直至客戶機同一個命名管道連接
CreateEvent 創建一個事件對象
CreateMailslot 創建一個郵路。返回的句柄由郵路服務器使用(收件人)
CreateMutex 創建一個互斥體(MUTEX)
CreateNamedPipe 創建一個命名管道。返回的句柄由管道的服務器端使用
CreatePipe 創建一個匿名管道
CreateProcess 創建一個新進程(比如執行一個程序)
CreateSemaphore 創建一個新的信號機
CreateWaitableTimer 創建一個可等待的計時器對象
DisconnectNamedPipe 斷開一個客戶與一個命名管道的連接
DuplicateHandle 在指出一個現有系統對象當前句柄的情況下,為那個對象創建一個新句柄
ExitProcess 中止一個進程
FindCloseChangeNotification 關閉一個改動通知對象
FindExecutable 查找與一個指定文件關聯在一起的程序的文件名
FindFirstChangeNotification 創建一個文件通知對象。該對象用于監視文件系統發生的變化
FindNextChangeNotification 重設一個文件改變通知對象,令其繼續監視下一次變化
FreeLibrary 釋放指定的動態鏈接庫
GetCurrentProcess 獲取當前進程的一個偽句柄
GetCurrentProcessId 獲取當前進程一個唯一的標識符
GetCurrentThread 獲取當前線程的一個偽句柄
GetCurrentThreadId 獲取當前線程一個唯一的線程標識符
GetExitCodeProces 獲取一個已中斷進程的退出代碼
GetExitCodeThread 獲取一個已中止線程的退出代碼
GetHandleInformation 獲取與一個系統對象句柄有關的信息
GetMailslotInfo 獲取與一個郵路有關的信息
GetModuleFileName 獲取一個已裝載模板的完整路徑名稱
GetModuleHandle 獲取一個應用程序或動態鏈接庫的模塊句柄
GetPriorityClass 獲取特定進程的優先級別
GetProcessShutdownParameters 調查系統關閉時一個指定的進程相對于其它進程的關閉早遲情況
GetProcessTimes 獲取與一個進程的經過時間有關的信息
GetProcessWorkingSetSize 了解一個應用程序在運行過程中實際向它交付了多大容量的內存
GetSartupInfo 獲取一個進程的啟動信息
GetThreadPriority 獲取特定線程的優先級別
GetTheardTimes 獲取與一個線程的經過時間有
GetTheardTimes 獲取與一個線程的經過時間有關的信息
GetWindowThreadProcessId 獲取與指定窗口關聯在一起的一個進程和線程標識符
LoadLibrary 載入指定的動態鏈接庫,并將它映射到當前進程使用的地址空間
LoadLibraryEx 裝載指定的動態鏈接庫,并為當前進程把它映射到地址空間
LoadModule 載入一個Windows應用程序,并在指定的環境中運行
MsgWaitForMultipleObjects 等侯單個對象或一系列對象發出信號。如返回條件已經滿足,則立即返回
SetPriorityClass 設置一個進程的優先級別
SetProcessShutdownParameters 在系統關閉期間,為指定進程設置他相對于其它程序的關閉順序
SetProcessWorkingSetSize 設置操作系統實際劃分給進程使用的內存容量
SetThreadPriority 設定線程的優先級別
ShellExecute 查找與指定文件關聯在一起的程序的文件名
TerminateProcess 結束一個進程
WinExec 運行指定的程序

12. API之控件與消息函數

AdjustWindowRect 給定一種窗口樣式,計算獲得目標客戶區矩形所需的窗口大小
AnyPopup 判斷屏幕上是否存在任何彈出式窗口
ArrangeIconicWindows 排列一個父窗口的最小化子窗口
AttachThreadInput 連接線程輸入函數
BeginDeferWindowPos 啟動構建一系列新窗口位置的過程
BringWindowToTop 將指定的窗口帶至窗口列表頂部
CascadeWindows 以層疊方式排列窗口
ChildWindowFromPoint 返回父窗口中包含了指定點的第一個子窗口的句柄
ClientToScreen 判斷窗口內以客戶區坐標表示的一個點的屏幕坐標
CloseWindow 最小化指定的窗口
CopyRect 矩形內容復制
DeferWindowPos 該函數為特定的窗口指定一個新窗口位置
DestroyWindow 清除指定的窗口以及它的所有子窗口
DrawAnimatedRects 描繪一系列動態矩形
EnableWindow 指定的窗口里允許或禁止所有鼠標及鍵盤輸入
EndDeferWindowPos 同時更新DeferWindowPos調用時指定的所有窗口的位置及狀態
EnumChildWindows 為指定的父窗口枚舉子窗口
EnumThreadWindows 枚舉與指定任務相關的窗口
EnumWindows 枚舉窗口列表中的所有父窗口
EqualRect 判斷兩個矩形結構是否相同
FindWindow 尋找窗口列表中第一個符合指定條件的頂級窗口
FindWindowEx 在窗口列表中尋找與指定條件相符的第一個子窗口
FlashWindow 閃爍顯示指定窗口
GetActiveWindow 獲得活動窗口的句柄
GetCapture 獲得一個窗口的句柄,這個窗口位于當前輸入線程,且擁有鼠標捕獲(鼠標活動由它接收)
GetClassInfo 取得WNDCLASS結構(或WNDCLASSEX結構)的一個副本,結構中包含了與指定類有關的信息
GetClassLong 取得窗口類的一個Long變量條目
GetClassName 為指定的窗口取得類名
GetClassWord 為窗口類取得一個整數變量
GetClientRect 返回指定窗口客戶區矩形的大小
GetDesktopWindow 獲得代表整個屏幕的一個窗口(桌面窗口)句柄
GetFocus 獲得擁有輸入焦點的窗口的句柄
GetForegroundWindow 獲得前臺窗口的句柄
GetLastActivePopup 獲得在一個給定父窗口中最近激活過的彈出式窗口的句柄
GetParent 判斷指定窗口的父窗口
GetTopWindow 搜索內部窗口列表,尋找隸屬于指定窗口的頭一個窗口的句柄
GetUpdateRect 獲得一個矩形,它描敘了指定窗口中需要更新的那一部分
GetWindow 獲得一個窗口的句柄,該窗口與某源窗口有特定的關系
GetWindowContextHelpId 取得與窗口關聯在一起的幫助場景ID
GetWindowLong 從指定窗口的結構中取得信息
GetWindowPlacement 獲得指定窗口的狀態及位置信息
GetWindowRect 獲得整個窗口的范圍矩形,窗口的邊框、標題欄、滾動條及菜單等都在這個矩形內
GetWindowText 取得一個窗體的標題(caption)文字,或者一個控件的內容
GetWindowTextLength 調查窗口標題文字或控件內容的長短
GetWindowWord 獲得指定窗口結構的信息
InflateRect 增大或減小一個矩形的大小
IntersectRect 這個函數在lpDestRect里載入一個矩形,它是lpSrc1Rect與lpSrc2Rect兩個矩形的交集
InvalidateRect 屏蔽一個窗口客戶區的全部或部分區域
IsChild 判斷一個窗口是否為另一窗口的子或隸屬窗口
IsIconic 判斷窗口是否已最小化
IsRectEmpty 判斷一個矩形是否為空
IsWindow 判斷一個窗口句柄是否有效
IsWindowEnabled 判斷窗口是否處于活動狀態
IsWindowUnicode 判斷一個窗口是否為Unicode窗口。這意味著窗口為所有基于文本的消息都接收Unicode文字
IsWindowVisible 判斷窗口是否可見
IsZoomed 判斷窗口是否最大化
LockWindowUpdate 鎖定指定窗口,禁止它更新
MapWindowPoints 將一個窗口客戶區坐標的點轉換到另一窗口的客戶區坐標系統
MoveWindow 改變指定窗口的位置和大小
OffsetRect 通過應用一個指定的偏移,從而讓矩形移動起來
OpenIcon 恢復一個最小化的程序,并將其激活
PtInRect 判斷指定的點是否位于矩形內部
RedrawWindow 重畫全部或部分窗口
ReleaseCapture 為當前的應用程序釋放鼠標捕獲
ScreenToClient 判斷屏幕上一個指定點的客戶區坐標
ScrollWindow 滾動窗口客戶區的全部或一部分
ScrollWindowEx 根據附加的選項,滾動窗口客戶區的全部或部分
SetActiveWindow 激活指定的窗口
SetCapture 將鼠標捕獲設置到指定的窗口
SetClassLong 為窗口類設置一個Long變量條目
SetClassWord 為窗口類設置一個條目
SetFocusAPI 將輸入焦點設到指定的窗口。如有必要,會激活窗口
SetForegroundWindow 將窗口設為系統的前臺窗口
SetParent 指定一個窗口的新父
SetRect 設置指定矩形的內容
SetRectEmpty 將矩形設為一個空矩形
SetWindowContextHelpId 為指定的窗口設置幫助場景(上下文)ID
SetWindowLong 在窗口結構中為指定的窗口設置信息
SetWindowPlacement 設置窗口狀態和位置信息
SetWindowPos 為窗口指定一個新位置和狀態
SetWindowText 設置窗口的標題文字或控件的內容
SetWindowWord 在窗口結構中為指定的窗口設置信息
ShowOwnedPopups 顯示或隱藏由指定窗口所有的全部彈出式窗口
ShowWindow 控制窗口的可見性
ShowWindowAsync 與ShowWindow相似
SubtractRect 裝載矩形lprcDst,它是在矩形lprcSrc1中減去lprcSrc2得到的結果
TileWindows 以平鋪順序排列窗口
UnionRect 裝載一個lpDestRect目標矩形,它是lpSrc1Rect和lpSrc2Rect聯合起來的結果
UpdateWindow 強制立即更新窗口
ValidateRect 校驗窗口的全部或部分客戶區
WindowFromPoint 返回包含了指定點的窗口的句柄。忽略屏蔽、隱藏以及透明窗口

定制與開發應用之二: 可擴展編程(一)

相比于COM組件編程,可編程性擴展雖然比不上COM組件操作簡單,但是由于可編程性擴展提供了底層的C語言編程接口,使得擴展編程擁有更高的運行效率和更穩定的執行能力,而且還使JAVA等其他編程語言調用SPSS進行分析成為可能。SPSS公司近年來著力加強了SPSS統計軟件包對可編程性擴展的支持。從支持編程的多樣性來看,SPSS的最新版本Statistics 17支持Python語言、SAS、R語言和.NET(C++、C#、VB)的集成開發,并提供了C語言的API(Application Programming Interface,應用程序編程接口)。

從編程靈活性來看,SPSS既可基于Script下的Saxbasic調用外部的Python、SAS、R及.NET程序,又可以被這些語言編寫的程序所調用。從支持的操作系統來看,它既支持UNIX環境,又支持Windows環境。從運行特性來講,既可以在后臺調用SPSS處理器來完成指定任務得到輸出的分析結果,又可以構建前端界面,實現與用戶的窗口交互。可見,SPSS為用戶提供了越來越靈活的編程技術支持,而且可編程性擴展已經成為SPSS高級用戶自定制應用的良好選擇。用戶基于SPSS使用可編程性擴展,可以構建靈活、綜合、與現有系統高度集成的企業級應用。SPSS的可編程性擴展最權威的資料是SPSS的官方文檔,對版本Statistics 17.0而言,主要是《Programming and Data Management for SPSS Statistics 17.0》、《SPSS Statistics Programmability Extension Developer's Guide for Windows》和《SPSS Statistics Programmability Extension Developer's Guide for UNIX》。此外,SPSS還在可編程性擴展包中發布了相關的簡單編程實例,可謂是周到。上述這些資料都可以在SPSS的官方網站開發人員中心下載欄目免費獲取。

使用SPSS的可編程性擴展來進行開發和應用,首先要很好的理解SPSS Statistics的基礎是什么,以及它如何工作。SPSS支持三種應用方式下的開發:
  1. SPSS統計應用(SPSS Statistics),它有圖形化用戶界面,但是編程擴展不適用GUI(圖形化用戶界面)。
  2. SPSS服務器(SPSS Server),它是一個分布式的應用,擁有一個客戶端/服務器架構。它為資源密集型操作分發客戶端請求到一個強大的分析服務軟件。請求由客戶端提交,被SPSS統計服務器處理。
  3. SPSS統計批處理工具(SPSS Statistics Batch Facility),它包含在SPSS統計服務器里。它的任務是自動的數據管理和統計結果輸出。自動生產提供了無須人為干預的命令提交。批量處理工具把輸入的命令語言文件作為數據操作和統計的請求。它也沒有圖形用戶界面。
可編程性擴展包含在SPSS的基本系統里,提供擴展SPSS與需要獨立集成插件的外部程序語言交互的基本的支持。SPSS實現與外部語言的集成主要是通過兩個動態鏈接庫文件,第一個是SPSSXD API,它包括C語言應用編程接口(API)實現內部處理(spssxd.dll)和外部處理(spssxd_p.dll),該API允許外部處理器控制SPSS統計應用。第二個是通用接口spssdx.dll,它使SPSS可以執行寫在命令語句“BEGIN PROGRAM-END PROGRAM”語句塊間的外部語言代碼。

通常,一個插件包含兩種庫文件,第一種是MyLanguageInvokeSPSSXD,負責裝載spssxd.dll或者spssxd_p.dll,并且使外部語言可以使用SPSSXD API。第二種是InvokeMyLanguage,它通過spssdx.dll為SPSS激活外部處理器,是一個插件的備選組件。

定制與開發應用之二:可擴展編程C語言API

上次講到了兩種庫文件MyLanguageInvokeSPSSXD和InvokeMyLanguage。本節重點解析一下MyLanguageInvokeSPSSXD。

SPSS的C語言應用編程接口(SPSSXD API)在動態鏈接庫spssxd.dll中包含兩個方面的底層功能:第一種是提交操作請求給SPSS,請求的典型返回結果為錯誤碼,通過錯誤碼,可以得出操作結果是成功還是出現其他異常和錯誤。第二種是提交信息請求給SPSS,請求的典型返回結果是所請求的信息。這些底層功能實現對SPSS的功能操作,變量字典的獲取,輸出結果XML工作區信息的讀取,對SPSS活動數據集的操作。SPSS的C語言應用編程接口幫助文檔可以在SPSS提供的可擴展性編程spssxdAPI文件夾下找到。外部語言程序直接調用SPSS C語言應用編程接口的基本工作過程可以描述為以下步驟:
  1. 外部語言準備調用SPSS。
  2. 檢查SPSS后臺程序是否運行,沒有運行則裝載MyLanguageInvokeSPSSXD,如果運行則進入下一步。
  3. 獲得SPSS后臺程序句柄。成功則繼續,否則中斷。
  4. 初始化相關功能指針。成功則完整SPSS調用準備,否則中斷。
  5. 啟動SPSS通訊。成功則進入下一步,否則中斷。
  6. 檢查SPSS后臺狀態正常時,操作SPSS功能,輸出分析結果。
  7. 調用任務完成,終止SPSS通訊。
  8. 卸載動態鏈接庫。
  9. 外部語言程序調用SPSS結束。
以下為SPSS提供的官方樣例程序。C語言程序的主入口:
int _tmain(int argc, _TCHAR* argv[])
{
//初始化傳入參數個數為1
int count = 1;
?? if (argc >1)
?????? count = atoi(argv[1]);

__time64_t stime; //time.h time類中定義的結構
?? _time64( &stime );//the start time of the test

//裝載DLL
int load = LoadLib();
//判斷是否成功
??? if ( load != 0 ){
?????? std::cout << "load failure, exitcode = " << load << std::endl;
?????? return -1;
?? }

//創建暫存結果的文件
std::string tempfile = "d:/temp/result.txt";
?? std::string tempresult("-out ");
?? tempresult = tempresult + tempfile;
??
//申明狀態檢查
int err = 0;
//啟動SPSS通信
err = StartSpss(tempresult.c_str());
if( err != 0 ){
????????? std::cout << "start spss failed, exitcode = " << err << std::endl;
?????? return -1;
????????? }
//To Do Work
for (int i=0; i<count; i++){
????????? //判斷是否就緒
????????? int ready = IsBackendReady();
????????? if( ready != 1 ){
?????????????????? std::cout << "backend is not ready, exitcode = " << ready << std::endl;
?????????????????? return -1;
????????? }
????????? //確定要處理的文件
????????? std::vector<std::string> fList; //data file list
????????? filelist(fList);
????????? //檢驗并打開文件
????????? int index=i%(int)fList.size();
?????? err = getfile(fList[index].c_str());
?????? if (err !=0 ){
?????????? std::cout << "get file error: filename=>" << fList[index] << " err=" << err << std::endl;
?????????????????? return -1;
?????????????????? }
????????? //測試XPath和通用功能
?????????? XPathAndGeneralFunctions(fList[index].c_str());
?????????? int iPosition = 0;
?????????? Displayresult(tempfile.c_str(), iPosition);
????????? std::cout <<"The end of XPATH result output! \n"<<endl;
????????? //開始一個用戶的過程
????????? StartProcedure("UserProc1");
????????? //操作數據庫
????????? DataSourceFunctions();
????????? Displayresult(tempfile.c_str(), iPosition);
????????? //測試轉軸表
????????? PivotTableFunctions();
????????? Displayresult(tempfile.c_str(), iPosition);
????????? //結束過程
????????? EndProcedure();
????????? //測試數據數據集
????????? DataStepFunctions();
????????? Displayresult(tempfile.c_str(), iPosition);
????????? }
//終止SPSS通信
StopSpss();
//卸載DLL
FreeLib();
return 0;
}
進一步深入LoadLib(),該方法由load.cpp提供,源代碼如下:
/**
* load.c -
* load and unload spssxd.dll dynamically.
* COPYRIGHT
* Copyright 2005 by SPSS Inc. All rights reserved.
*/

#include "load.h"
#include <iostream>
using namespace std;
//declare the function pointer.
FP_IsBackendReady?????????????????? IsBackendReady =????????????? NULL;
FP_IsXDriven??????????????????????? IsXDriven =?????????????????? NULL;
FP_StartSpss??????????????????????? StartSpss =?????????????????? NULL;
FP_StopSpss???????????????????????? StopSpss =??????????????????? NULL;
FP_Submit?????????????????????????? Submit =????????????????????? NULL;
FP_QueueCommandPart???????????????? QueueCommandPart =??????????? NULL;
FP_PostSpssOutput?????????????????? PostSpssOutput =????????????? NULL;
FP_GetVariableCount???????????????? GetVariableCount =??????????? NULL;
FP_GetRowCount????????????????????? GetRowCount =???????????????? NULL;
FP_GetVariableName????????????????? GetVariableName =???????????? NULL;
FP_GetVariableLabel???????????????? GetVariableLabel =??????????? NULL;
FP_GetVariableType????????????????? GetVariableType =???????????? NULL;
FP_GetVariableFormat??????????????? GetVariableFormat =?????????? NULL;
FP_GetVariableMeasurementLevel????? GetVariableMeasurementLevel = NULL;
FP_CreateXPathDictionary??????????? CreateXPathDictionary =?????? NULL;
FP_RemoveXPathHandle??????????????? RemoveXPathHandle =?????????? NULL;
FP_EvaluateXPath??????????????????? EvaluateXPath =?????????????? NULL;
FP_GetStringListLength????????????? GetStringListLength =???????? NULL;
FP_GetStringFromList??????????????? GetStringFromList =?????????? NULL;
FP_RemoveStringList???????????????? RemoveStringList =??????????? NULL;
FP_GetXmlUtf16????????????????????? GetXmlUtf16 =???????????????? NULL;
FP_GetHandleList??????????????????? GetHandleList =?????????????? NULL;
FP_GetNumericValue????????????????? GetNumericValue =???????????? NULL;
FP_GetStringValue?????????????????? GetStringValue =????????????? NULL;
FP_MakeCaseCursor????????????? MakeCaseCursor =???????????? NULL;
FP_NextCase???????????????????????? NextCase =??????????????????? NULL;
FP_RemoveCaseCursor???????????????? RemoveCaseCursor =??????????? NULL;
FP_GetVariableFormatType??????????? GetVariableFormatType =?????? NULL;
FP_GetCursorPosition??????????????? GetCursorPosition =?????????? NULL;

FP_StartPivotTable??????????????? StartPivotTable = NULL;????????????????????????????????????????????????
FP_AddDimension?????????????????? AddDimension = NULL;????????????????????????????????????????????????
FP_AddStringCategory????????????? AddStringCategory = NULL;????????????????????????????????????????????????
FP_SetFormatSpecCount???????????? SetFormatSpecCount = NULL;????????????????????????????????????????????????
FP_SetNumberCell????????????????? SetNumberCell = NULL;????????????????????????????????????????????????
FP_AddCellFootnotes?????????????? AddCellFootnotes = NULL;????????????????????????????????????????????????
FP_AddTextBlock?????????????????? AddTextBlock = NULL;
FP_StartProcedure???????????????? StartProcedure = NULL;??????????????????????????????????????????????
FP_EndProcedure?????????????????? EndProcedure = NULL;

FP_StartDataStep??????????????? StartDataStep = NULL;????????????????????????????????????????????????
FP_CreateDataset????????????????? CreateDataset = NULL;????????????????????????????????????????????
FP_GetCaseCountInDS???????????? GetCaseCountInDS = NULL;
FP_InsertCase??????????? InsertCase = NULL;
FP_DeleteCase???????????????? DeleteCase = NULL;?????????????????????????
FP_GetVarTypeInDS?????????????? GetVarTypeInDS = NULL;
FP_GetNCellValue?????????????????? GetNCellValue = NULL;
FP_GetCCellValue??????????????? GetCCellValue = NULL;
FP_SetNCellValue?????????????????? SetNCellValue = NULL;
FP_SetCCellValue?????????????????? SetCCellValue = NULL;
FP_EndDataStep??????????????? EndDataStep = NULL;

HMODULE pLib = NULL; //初始化一個句柄
const char libName[] = "spssxd_p.dll"; //SPSS的動態鏈接庫
const int LOAD_FAIL = 1011;
const int LOAD_SUCCESS = 0;

//Initialize the function pointer
void InitializeFP()
{
?? //GetProcAddress函數檢索指定的動態鏈接庫(DLL)中的輸出庫函數地址,參數為句柄加函數名,返回的是動態鏈接庫的空間地址
IsBackendReady = (FP_IsBackendReady)GetProcAddress(pLib,"IsBackendReady");
?? //上句檢查動態鏈接庫后臺已經準備就緒,設置后臺準備狀態為就緒布爾型
//下句設置動態鏈接庫驅動正確布爾型
IsXDriven = (FP_IsXDriven)GetProcAddress(pLib,"IsXDriven");
//設置動態鏈接庫為SPSS開始的命令行字符串
?? StartSpss = (FP_StartSpss)GetProcAddress(pLib,"StartSpss");
//設置動態鏈接庫為SPSS結束整型
?? StopSpss = (FP_StopSpss)GetProcAddress(pLib,"StopSpss");
//設置動態鏈接庫為SPSS提交的命令行包括提交命令及其長度返回整型
?? Submit = (FP_Submit)GetProcAddress(pLib,"Submit");
//設置動態鏈接庫為SPSS提交的隊列命令包括提交行命令及其長度返回整型
?? QueueCommandPart = (FP_QueueCommandPart)GetProcAddress(pLib,"QueueCommandPart");
//設置動態鏈接庫為SPSS返回結構的文本返回整型
?? PostSpssOutput = (FP_PostSpssOutput)GetProcAddress(pLib,"PostSpssOutput");
//設置動態鏈接庫為SPSSF能取得的變量個數返回整型
?? GetVariableCount = (FP_GetVariableCount)GetProcAddress(pLib,"GetVariableCount");
//設置動態鏈接庫為SPSSF能取得的記錄行數返回整型
?? GetRowCount = (FP_GetRowCount)GetProcAddress(pLib,"GetRowCount");
//設置動態鏈接庫為SPSS能取得的變量名稱返回字符型
?? GetVariableName = (FP_GetVariableName)GetProcAddress(pLib,"GetVariableName");
//設置動態鏈接庫為SPSS能取得的變量標簽返回字符型
?? GetVariableLabel = (FP_GetVariableLabel)GetProcAddress(pLib,"GetVariableLabel");
//設置動態鏈接庫為SPSS能取得的變量類型返回字符型
?? GetVariableType = (FP_GetVariableType)GetProcAddress(pLib,"GetVariableType");
//設置動態鏈接庫為SPSS能取得的變量格式返回字符型
?? GetVariableFormat = (FP_GetVariableFormat)GetProcAddress(pLib,"GetVariableFormat");
//設置動態鏈接庫為SPSS能取得的變量評價層次返回整型
?? GetVariableMeasurementLevel = (FP_GetVariableMeasurementLevel)GetProcAddress(pLib,"GetVariableMeasurementLevel");
?? //設置動態鏈接庫為SPSS創建的XPATH字典返回整型
CreateXPathDictionary = (FP_CreateXPathDictionary)GetProcAddress(pLib,"CreateXPathDictionary");
?? //設置動態鏈接庫為SPSS刪除的XPATH處理返回整型
RemoveXPathHandle = (FP_RemoveXPathHandle)GetProcAddress(pLib,"RemoveXPathHandle");
?? //設置動態鏈接庫為SPSS評估的XPATH處理(包括處理,上下文,表達式)無返回
EvaluateXPath =(FP_EvaluateXPath)GetProcAddress(pLib,"EvaluateXPath");
?? //設置動態鏈接庫為SPSS處理的列表返回整型
GetStringListLength = (FP_GetStringListLength)GetProcAddress(pLib,"GetStringListLength");
?? //設置動態鏈接庫為SPSS處理的字符列表返回字符
GetStringFromList = (FP_GetStringFromList)GetProcAddress(pLib,"GetStringFromList");
?? //設置動態鏈接庫為SPSS刪除處理的字符列表返回字符
RemoveStringList = (FP_RemoveStringList)GetProcAddress(pLib,"RemoveStringList");
?? //設置動態鏈接庫為SPSS處理的XML返回字符
GetXmlUtf16 = (FP_GetXmlUtf16)GetProcAddress(pLib,"GetXmlUtf16");
?? //設置動態鏈接庫為SPSS處理的列表無返回
GetHandleList = (FP_GetHandleList)GetProcAddress(pLib,"GetHandleList");
?? //設置動態鏈接庫為SPSS結果和變量索引返回整型
GetNumericValue = (FP_GetNumericValue)GetProcAddress(pLib,"GetNumericValue");
?? //設置動態鏈接庫為SPSS結果、緩沖長度和變量索引返回整型
GetStringValue = (FP_GetStringValue)GetProcAddress(pLib,"GetStringValue");
//創建游標 返回整型
MakeCaseCursor = (FP_MakeCaseCursor)GetProcAddress(pLib,"MakeCaseCursor");
//移動到下一個案例 返回整型
NextCase = (FP_NextCase)GetProcAddress(pLib,"NextCase");
//移除案例游標返回整型
RemoveCaseCursor = (FP_RemoveCaseCursor)GetProcAddress(pLib,"RemoveCaseCursor");
//由格式類型拿到變量格式類型返回整型
GetVariableFormatType = (FP_GetVariableFormatType)GetProcAddress(pLib,"GetVariableFormatType");
?? //得到游標位置
GetCursorPosition = (FP_GetCursorPosition)GetProcAddress(pLib,"GetCursorPosition");
//
?? StartPivotTable = (FP_StartPivotTable)GetProcAddress(pLib,"StartPivotTable");
?? AddDimension = (FP_AddDimension)GetProcAddress(pLib,"AddDimension");
?? AddStringCategory = (FP_AddStringCategory)GetProcAddress(pLib,"AddStringCategory");
?? SetFormatSpecCount = (FP_SetFormatSpecCount)GetProcAddress(pLib,"SetFormatSpecCount");
?? SetNumberCell = (FP_SetNumberCell)GetProcAddress(pLib,"SetNumberCell");
?? AddCellFootnotes = (FP_AddCellFootnotes)GetProcAddress(pLib,"AddCellFootnotes");
?? AddTextBlock = (FP_AddTextBlock)GetProcAddress(pLib,"AddTextBlock");
StartProcedure = (FP_StartProcedure)GetProcAddress(pLib,"StartProcedure");
?? EndProcedure = (FP_EndProcedure)GetProcAddress(pLib,"EndProcedure");

StartDataStep =??????? (FP_StartDataStep)GetProcAddress(pLib,"StartDataStep");
CreateDataset =????? (FP_CreateDataset)GetProcAddress(pLib,"CreateDataset");
GetCaseCountInDS = (FP_GetCaseCountInDS)GetProcAddress(pLib,"GetCaseCountInDS");
InsertCase = (FP_InsertCase)GetProcAddress(pLib,"InsertCase");
DeleteCase = (FP_DeleteCase)GetProcAddress(pLib,"DeleteCase");
GetVarTypeInDS = (FP_GetVarTypeInDS)GetProcAddress(pLib,"GetVarTypeInDS");
GetNCellValue =????? (FP_GetNCellValue)GetProcAddress(pLib,"GetNCellValue");
GetCCellValue =????? (FP_GetCCellValue)GetProcAddress(pLib,"GetCCellValue");
SetNCellValue =?????? (FP_SetNCellValue)GetProcAddress(pLib,"SetNCellValue");
SetCCellValue =?????? (FP_SetCCellValue)GetProcAddress(pLib,"SetCCellValue");
EndDataStep = (FP_EndDataStep)GetProcAddress(pLib,"EndDataStep");

}

int LoadLib()
{
//判斷是否得到句柄pLib
?? if(NULL == pLib){ //libName = "spssxd.dll"
?????? //find out spssxd.dll module, it will success when spss drive
?????? pLib = GetModuleHandle(libName);//如果SPSS是運行的,這里獲得名為spssxd.dll的句柄
?????? //find out spssxd.dll module failure, load it.
?????? if(NULL == pLib) {//SPSS程序此時沒有運行,所以這里句柄為Null
?????????? pLib = LoadLibrary(libName);//重新載入名為spssxd.dll的鏈接庫道地址空間,進而訪問該資源
?????? }
?????? //load spssxd.dll module success, initialize the function pointer這里成功載入動態鏈接庫
?????? if (pLib) {//載入動態鏈接庫spssxd.dll,并開始初始化功能指針
?????????? InitializeFP();
?????? }
?????? //load failure
?????? else {
?????????? return LOAD_FAIL;//裝載失敗
?????? }
?? }?
?? return LOAD_SUCCESS;//裝載成功
}

void FreeLib()
{
?? FreeLibrary(pLib);
?? pLib= NULL;

?? IsBackendReady = NULL;
?? IsXDriven = NULL;
?? StartSpss = NULL;
?? StopSpss = NULL;
?? Submit = NULL;
?? QueueCommandPart = NULL;
?? PostSpssOutput = NULL;
?? GetVariableCount = NULL;
?? GetRowCount = NULL;
?? GetVariableName = NULL;
?? GetVariableLabel = NULL;
?? GetVariableType = NULL;
?? GetVariableFormat = NULL;
?? GetVariableMeasurementLevel = NULL;
?? CreateXPathDictionary = NULL;
?? RemoveXPathHandle = NULL;
?? EvaluateXPath = NULL;
?? GetStringListLength = NULL;
?? GetStringFromList = NULL;
?? RemoveStringList = NULL;
?? GetXmlUtf16 = NULL;
?? GetHandleList = NULL;
?? GetNumericValue = NULL;
?? GetStringValue = NULL;
??? MakeCaseCursor = NULL;
?? NextCase = NULL;
?? RemoveCaseCursor = NULL;
?? GetVariableFormatType = NULL;
?? GetCursorPosition = NULL;
??? StartPivotTable = NULL;????????????????????????????????????????????????
??? AddDimension = NULL;????????????????????????????????????????????????
??? AddStringCategory = NULL;????????????????????????????????????????????????
??? SetFormatSpecCount = NULL;????????????????????????????????????????????????
??? SetNumberCell = NULL;????????????????????????????????????????????????
??? AddCellFootnotes = NULL;????????????????????????????????????????????????
??? AddTextBlock = NULL;
??? StartProcedure = NULL;??????????????????????????????????????????????
??? EndProcedure = NULL;
??? StartDataStep = NULL;????????????????????????????????????????????????
??? CreateDataset = NULL;????????????????????????????????????????????
??? GetCaseCountInDS = NULL;
??? InsertCase = NULL;
??? DeleteCase = NULL;?????????????????????????
??? GetVarTypeInDS = NULL;
??? GetNCellValue = NULL;
??? GetCCellValue = NULL;
??? SetNCellValue = NULL;
??? SetCCellValue = NULL;
??? EndDataStep = NULL;

}

Python的C語言擴展

C-Python,或者CPython,指C實現的Python虛擬機的基礎API。最通用的Python就是是基于C實現的,它的底層API稱為C-Python API,所有Python代碼的最終變成這些API以及數據結構的調用,才有了Python世界的精彩。

Cython,準確說Cython是單獨的一門語言,專門用來寫在Python里面import用的擴展庫。實際上Cython的語法基本上跟Python一致,而Cython有專門的“編譯器”先將 Cython代碼轉變成C(自動加入了一大堆的C-Python API),然后使用C編譯器編譯出最終的Python可調用的模塊。

GIL:Global Interpreter Lock,是Python虛擬機的多線程機制的核心機制,翻譯為:全局解釋器鎖。其實Python線程是操作系統級別的線程,在不同平臺有不同的底層實現(如win下就用win32_thread, posix下就用pthread等),Python解釋器為了使所有對象的操作是線程安全的,使用了一個全局鎖(GIL)來同步所有的線程,所以造成“一個時刻只有一個Python線程運行”的偽線程假象。GIL是個顆粒度很大的鎖,它的實現跟性能問題多年來也引起過爭議,但到今天它還是經受起了考驗,即使它讓Python在多核平臺下CPU得不到最大發揮。

什么是BIOS?

BIOS即基本輸入輸出系統,它是PC機的操作的基礎。當計算機上電時,BIOS是第一個被執行的程序,DOS和其它程序都通過BIOS來存取計算機內部的各種硬件設備。

然而,引導程序并不是計算機內唯一被稱為BIOS的代碼。實際上,PC機上電時要執行的BIOS通常被稱為主板BIOS,因為它被存放在主板上。直到不久之前,這個BIOS還被固化在一塊ROM芯片上,因而無法為了修改錯誤和擴充功能而重新編寫它。現在,主板BIOS被存放在一塊叫做Flash EPROM的可重新編程的存儲器芯片中,但它還是原來的BIOS。不管怎樣。主板BIOS會讀遍系統內存,從而找到系統中其它一些硬件設備,這些設備都帶有自身要使用的一些基礎代碼(即其它的BIOS代碼)。例如,VGA卡就有其自身的BIOS,通常被稱為Video BIOS或VGA BIOS;硬盤和軟盤控制器也有一個BIOS,并且也在系統引導時被執行。當人們提及BIOS時,或者是指這些程序的集合,或者是指其中單獨的一個BIOS,這兩種說法部對。

根據上述介紹,你應該知道BIOS并不是DOS——BIOS是PC機中最底層的功能軟件。DOS剛好位于BIOS上面的一層,并且經常調用BIOS來完成一些基本操作,而這些操作可能會被你誤認為是"DOS"函數。例如,你可能會用DOS函數40H來把數據寫到硬盤上的一個文件中,而DOS最終還是要通過調用硬盤BIOS的函數03來把數據寫到硬盤上。

mso-bidi-font-family:宋體; mso-font-kerning:0pt'>正在執行重要的代碼時,把這一情況通知DOS。然而,該標志對程序員也是很有用的,因為他們能由此知道什么時候DOS處于忙狀態。盡管從DOS 2.0版開始就有這個函數了,但因為Microsoft最近已經公開了這個函數,所以從技術角度上講它已不再是一個未公開的函數。有幾本很不錯的書介紹了已公開和未公開的DOS函數,對這個問題有興趣的讀者可以去閱讀這些書。

什么是中斷?

首先,中斷分硬件中斷和軟件中斷兩種。中斷為計算機的硬件設備和軟件"部件"提供了一種相互交流的途徑,這就是它的作用。那么,都有哪些中斷呢?它們又是怎樣實現這種交流的呢?

PC機中的CPU通常都是Intel 80x86處理器,它有幾條引腳用來中斷CPU的當前工作,并使它轉去進行其它工作。每條中斷引腳上都連接著一些硬件設備(例如定時器),其作用是為這條引腳提供一個特定的電壓。當中斷事件發生時,處理器會停止執行當前正在執行的軟件,保存當前的操作狀態·然后去“處理”中斷。處理器中事先已經裝有一張中斷向量表,其中列出了每個中斷號以及當某個特定中斷發生時所應執行的程序。

以系統定時器為例——作為要完成的許多任務中的一部分,PC機需要維持一天的計時工作,其具體工作過程為:(1)一個硬件計時器每秒鐘向CPU發出18次中斷;(2)CPU停止當前的工作并在中斷向量表中查找負責維持系統計時器數據的程序(這種程序叫做中斷處理程序(interrupt handler),因為它的工作就是在中斷發生時處理中斷);(3)CPU執行該程序(將新的定時器數據存入系統內存),然后返回到剛才被中斷的地方繼續往下執行。當你的程序要求使用當前時間時,定時器數據就會按照你要求的格式被組織好并傳給程序。以上的解釋大大簡化了定時器中斷的工作情況,但它是一個很好的硬件中斷的例子。

系統定時器只是通過中斷機制發生的數百個事件(有時被稱為中斷)中的一個。在很多時候,硬仵并不參與到中斷處理過程中去。換句話說,軟件經常會通過中斷來調用其它軟件,并且可以不需要硬件的參與。DOS和BIOS就是這方面的兩個主要例子。當一個程序打開一個文件,讀/寫一個文件,把字符寫到屏幕上,從鍵盤那里得到一個字符,甚至詢問當前時間時,都需要有一個軟件中斷來完成這項任務。你可能不知道發生了這些事情,因為這些中斷都深藏在你所調用的那些無足輕重的小函數(例如getch(),fopen()和ctime())的后面。

在C中,你可以通過int86()和int86x()函數產生中斷。int86()和int86x()函數要求用你想產生的中斷號作為它們的一個參數。當你調用其中的一個函數時,CPU將象前面所講的那樣被中斷,并儉查中斷向量表,以找到需要執行的那個程序。在調用這兩個函數時,通常將執行的是一個DOS或BIOS程序。表14.6列出了一些常見的中斷,你可以通過它們設置或檢索計算機的有關信息。注意這并不是一張完整的表,并且其中的每個中斷都可以服務于數百種不同的函數。
???????????????????? 表14.6? 常見的PC中斷
—————————————————————————————————————
? 中斷(hex)????????? 描述
————一————————————————————————————————
? 5???????????????? 屏幕打印服務
? 10??????????????? 視頻顯示服務(MDA,CGA,EGA,VGA)
? 11??????????????? 獲得設備清單
? 12????? ????????? 獲得內存大小
? 13 ?????????????? 磁盤服務
? 14??????????????? 串行口服務
? 15 ?????????????? 雜項功能服務
? 16 ?????????????? 鍵盤服務
? 17??????????????? 打印機服務
? 1A??????????????? 時鐘服務
? 21??????????????? DOS函數
? 2F??????????????? DOS多路共享服務
? 33??????????????? 鼠標器服務
? 67??????????????? EMS服務
--------------------------------------------------------------------------
當你知道了什么是中斷后,你就會認識到:當計算機處于空閑狀態時,它每秒可能要處理幾十個中斷;而當計算機緊張工作時,它每秒經常要處理數百個中斷。在20.12中有一個例子程序,你可以參照該程序寫出自己的中斷處理程序,從而使兩個程序通過中斷進行交流。如果你覺得有意思,不妨試一下。

在C語言中應該使用ANSI函數還是BIOS函數,哪種方式更好?

兩種方式各有利弊。你必須先回答幾個問題,然后才能確定哪種方式適合你需要創建的那種應用。例如:你需要很快地實現你的應用嗎?你的應用僅僅是用來“證實有關概念”,還是一個“真正的應用”呢?速度對你的應用重要嗎?下面比較了使用ANSI函數和使用BIOS函數的基本優點:

使用ANSI函數的優點:
  1. 只需要printf()語句就可完成任務
  2. 改變文本的顏色和屬性很方便
  3. 不管系統如何配置,都可以在所有PC機上工作
  4. 無需記憶BIOS iN數

使用BIOS函數的優點:
  1. 運行速度快
  2. 用BIOS可以做更多的事
  3. 不需要設備驅動程序(使用ANSI iN數需要ANSI.SYS)
  4. 無需記憶ANSI命令

剛開始時,你會發現用ANSI函數編程是很不錯的,并且能使你寫出一些漂亮的程序。然而,不久你就可能會發現ANSI函數“有些礙事”,此時你就會想用BIOS函數。當然,以后你又發現BIOS函數有時也會“礙事”,此時你就想使用一種更快的方式。例如,14.4中的一個例子甚至不通過BIOS來把文本打印到屏幕上,你也許會發現這種方法比使用ANSI或BIOS函數更有趣。

可以通過BIOS把顯示模式改為VGA圖形模式嗎?

當然可以。中斷10H,即Video BIOS,負責處理文本模式和圖形模式之間的轉換。當你所運行的程序要進行文本模式和圖形模式之間的相互轉換時(即使該程序是Microsoft Windows),就需要通過Video BIOS來實現這種轉換。每一種不同的設置都被稱作一種顯示模式。

要改變顯示模式,你必須通過int 10H服務來調用Video BIOS。這就是說,你必須向中斷10H的中斷處理程序發出中斷請求。除中斷號不同之外,這與實現DOS調用(int 21H)沒有什么區別。下面的一段程序通過調用Video BIOS函數0,先從標準文本模式(模式3)切換到一個由命令行輸入的模式號,然后再切換回來:
# include <stdlib. h>
# include <dos. h>
main(int argc, char? *? * argv)
{
??? union REGS regs;
??? int mode;
??? / * accept Mode number in hex * /
??? sscanf (argv[1] , " %x" , &mode) ;
??? regs. h. ah =? 0;??????????? /*? AH = 0 means "change display mode"? */
??? regs.h.al = (char)mode;????? /*? AL = ??, where ?? is the Mode number *
??? regs. x. bx =? 0;??????????? /*? Page number, usually zero? */
??? int86(0xl0, &regs, &regs);?? /*? Call the BIOS (intlO) * /
??? printf("Mode 0x%X now active\n" ,? mode);
??? printf ("Press any key to return. . . ") ;
??? getch();
??? regs. h. al = 3;????????????? / *? return to Mode 3? * /
??? int86(0xl0, &regs, &regs);
}
有一個有趣的特點并沒有在這個程序中表現出來,即該程序可以在不清屏的情況下改變顯示模式。在某些場合,這一特點極為有用。要想改變顯示模式,而又不影響屏幕內容,只需把存放在AI.寄存器中的顯示模式值和80H或一下。例如,如果你要切換到模式13H,你只需把93H存入AL中,而程序中其余的代碼可以保持不變。

今天,在VESA Video BIOS標準中已經加入了VGA卡對擴充顯示模式(見下文中的補充說明)的支持。然而,需要有一個新的“改變顯示模式”函數來支持這些擴充模式。按照VESA標準,在切換VESA模式時,應該使用函數4FH,而不是前文例子中的函數O。下面的程序改進了前文中的例子,以切換VESA模式:
# include <stdlib. h>
#include <dos. h>
main(int argc, char? * *? argv)
{
??? union REGS regs;
??? int mode;
??? / *? accept Mode number in hex * /
??? sscanf (argv[1], " %x" , &mode);
??? regs. x. ax = 0x4F02;?????? /* change display mode? * /
??? regs. x. bx = (short )mode;?? / * three-digit mode number? * /
??? int86(0x10, &regs, &regs);?? /*? Call the BIOS (intlO)? * /
??? if(regs.h.al !=0x4F){
??????? printf("VESA modes NOT? supported! \n" );
??? }
??? else {
??????? printf("Mode? Ox%X now active\n" , mode);
??????? printf ("Press any key to return. . . " ) ;
??????? getch() ;
????}
??? regs. h. al = 3;???????? / *? return to Mode 3? * /
??? int86(0x10,&regs, &regs) ;
}

注意,在切換VESA模式時,不能通過把模式號和80H或一下來達到不清屏的目的。但是。只要把原來兩位的(十六進制)模式號的最高位往前移一位,就得到了VESA模式號(所有VESA模式號的長度都是三位(十六進制),見下文中的補充說明)。因此,為了切換到VESA模式101H并且保留屏幕上的內容,你只需把VESA模式號換為901H。

關于顯示模式的補充說明:
IBM推出了一種顯示模式標準,該標準試圖定義所有可能會用到的顯示模式,其中包括所有可能的像素層次(顏色的數目)。因此,IBM創建了19種顯示模式(從OH到13H)。表14.8a給出了這種顯示模式標準。
?????????????????? 14.8a 標準顯示模式
-------------------------------------------------------------------------------
??? 模式(H)??????????? 分辨率??????????? 圖形/文本?????????? 顏色
-------------------------------------------------------------------------------
??? 0????????????????? 40X 25???????????? 文本???????????????? 單色
??? 1????????????????? 40 X 25??????????? 文本???????????????? 16
??? 2????????????????? 80X 25???????????? 文本???????????????? 單色
??? 3????????????????? 80X 25???????????? 文本???????????????? 16
??? 4????????????????? 320X 200?????????? 圖形?????????????????4
??? 5????????????????? 320X 200???????????圖形???????????????? 4級灰度
??? 6????????????????? 640X 200?????????? 圖形???????????????? 單色
??? 7????????????????? 80 X 25??????????? 文本???????????????? 單色
??? 8????????????????? 160X 200?????????? 圖形???????????????? 16
??? 9????????????????? 320X 200?????????? 圖形?????????????????16
??? A????????????????? 640 x 200????????? 圖形???????????????? 4
??? B????????????????? 保留給EC-A BIOS使用
?? C?????????????????? 保留給EGA BIOS使用
?? D?????????????????? 320×200?????????? 圖形???????????????? 16
?? E?????????????????? 640×200?????????? 圖形???????????????? 16
?? F?????????????????? 640×350?????????? 圖形???????????????? 單色
?? 10????????????????? 640×350?????????? 圖形????????????????? 4
?? 11????????????????? 640×480?????????? 圖形???????????????? 單色
?? 12????????????????? 640×480?????????? 圖形??????????????? 16
?? 13????????????????? 320×200?????????? 圖形???????????????? 256
-------------------------------------------------------------------------------
那么,你見過其中的某些模式嗎?模式3是80×25彩色文本模式,也就是PC機上電時你所看到的模式。當你把"VGA"(隨Windows提供的一個驅動程序)選為Microsoft Windows3.x的驅動程序時,你所看到的就是模式12(H)。注意,上表中并沒有一種顏色多于256色或分辨率高于640×480的模式。多年以來,模式4,9和D一直是DOS游戲開發者喜歡用的模式,它們擁有“高”達320×200的分辨率和足夠的顏色(4或16種),足以顯示一些“象樣”的圖形。所有流行的動畫游戲幾乎都使用模式13,例如DOOM(一代和二代),id軟件公司的new Heretic,Apogee公司的Rise of the Triad,Interplay公司的Descent,等等。實際上,許多動畫游戲在VGA卡上耍了個小花招,即把模式13的分辨率改為320×240??? 這種模式被稱為模式x,它有更多的內存頁。可以提高圖形質量和顯示速度。

那么,其它一些常見的顯示模式又是從哪里來的呢?它們是由VGA卡的制造商提供的。這些你可能已經熟悉的顯示模式來自各種各樣的渠道,但不管它們來自何處,VGA卡的制造商們都把它們加到了自己的VGA卡中,以增加這些VGA卡的價值。這些模式通常被稱為擴充顯示模式(extended display mode)。由于競爭和資本積累的原因,VGA卡的制造商們逐步轉向了這些更高級的顯示模式。有人還試過其它一些顯示模式(聽說過1152×900嗎?),但并不象上述模式那樣受歡迎。

那么。什么是VESA呢?它與VGA卡有什么關系呢?盡管VGA卡的制造商們都選擇了支持同樣的一組顯示模式(包括擴充模式),但他們都按自己的專用方式去實現其中的擴充模式,而游戲廠商和其它軟件廠商不得不去支持市場上每一種VGA卡的每一種專用方式。因此,一些制造商和其它方面的一些代表一起組成了一個委員會,以盡可能地使這些卡的設置和編程標準化,這個委員會就是VESA(Video Electronic Standards Association)。VESA委員會采用了一種擴充顯示模式的標準,從而使軟件可以通過普通的BIOS調用來設置和初始化所有符合該標準的VGA卡。基本上可以這樣說,在美國出售的所有的VGA卡都支持某種VESA標準。

所有的VESA模式(即VESA標準所包含的那些顯示模式)都采用寬度為9位(bit)的模式號,而不是標準模式的8位(hit)模式號。使用了9位(bit)的模式號后,就可以用三位十六進制數來表示VESA模式了,而IBM標準模式只能用兩位十六進制數(在表14.8a中,從0到13H)來表示,這樣就避免了模式號的沖突。因此,所有的VESA模式號都大于100H。VESA模式是這樣起作用的:假設你想讓你的VGA卡以1024×768和256色這樣的模式顯示,而這種模式就是VESA模式105,因此你要用模式號105作一次BIOS調用。Video BIOS(有時叫做VESA?BIOS)會把VESA模式號翻譯成內部專用號,以完成實際的模式切換工作。VGA卡的制造商們在每一塊VGA卡上都提供了一種可以完成上述翻譯工作的Video BIOS,因此你只需要搞清楚VESA模式號就行了。表14.8b列出了最新的VESA顯示模式(VESA是一個不斷發展的標準。)

?????????????????????????表14.8b? VESA顯示模式
----------------------------------------------------------------------------
? 分辨率????????????????????????????? 顏色?????????????????????? VESA模式
----------------------------------------------------------------------------
? 640X400???????????????????????????? 256??????????????????????? 100
? 640X480???????????????????????????? 256??????????????????????? 101
? 640X480???????????????????????????? 32768????????????????????? 110
? 640X480???????????????????????????? 65536????????????????????? 111
? 640X480???????????????????????????? 16. 7M???????????????????? 112
? 800X600???????????????????????????? 16???????????????????????? 102
? 800X600???????????????????????????? 256??????????????????????? 103
? 800X600???????????????????????????? 32768????????????????????? 113
? 800X600???????????????????????????? 65536????????????????????? 114
? 800X600???????????????????????????? 16. 7M???????????????????? 115
? 1024X768??????????????????????????? 16???????????????????????? 104
? 1024X768??????????????????????????? 256??????????????????????? 105
? 1024X768??????????????????????????? 32768????????????????????? 116
? 1024X768??????????????????????????? 65536????????????????????? 117
? 1024X768??????????????????????????? 16. 7M???????????????????? 118
? 1280X1024?????????????????????????? 16???????????????????????? 106
? 1280X1024?????????????????????????? 256??????????????????????? 107
? 1280X1024?????????????????????????? 32768????????????????????? 119
? 1280X1024?????????????????????????? 65536????????????????????? 11A
? 1280X1024?????????????????????????? 16. 7M???????????????????? 11B
-----------------------------------------------------------------------------
注意,這些都是人們熟悉的顯示模式,特別是在使用Microsoft Windows時,這些模式更為常見。

可以通過BIOS控制鼠標嗎?

可以。你可以通過中斷33H調用鼠標服務程序。表14.13列出了中斷33H中最常用的鼠標服務程序。
?????????????????????????? 表14.13鼠標中斷服務
--------------------------------------------------------------------------
??? 功能號??????????????????????????????? 描? 述
--------------------------------------------------------------------------
??? 0???????????????????????? 初始化鼠標;當前可見則隱藏它
??? 1???????????????????????? 顯示鼠標
??? 2???????????????????????? 隱藏鼠標
??? 3?????????????????????? ? 獲得鼠標位置
??? 4???????????????????????? 設置鼠標位置
??? 6???????????????????????? 檢查鼠標按鈕是否被按下
??? 7???????????????????????? 設置鼠標的水平限制值
??? 8???????????????????????? 設置鼠標的垂直限制值
??? 9???????????????????????? 設置圖形模式鼠標形狀
??? 10??????????????????????? 設置文本模式鼠標風格
??? 11??????????????????????? 獲得鼠標的移動步值
---------------------------------------------------------------------------

下面的例子通過上表中的一些鼠標服務程序來控制一個文本模式的鼠標:
# include <stdlib. h>
# include <dos. h>
main()
{
??? union REGS regs;
??? printf("Initializing Mouse. . . ") ;
??? regs. x. ax =? 0;
??? int86(0x33, &regs,? &regs);
??? printf("\nShowing Mouse. . . ") ;
??? regs. x.ax =? 1;
??? int86(0x33, &regs,? &regs);
??? printf ("\nMove mouse around. Press any key to quit. . . ") ;
??? getch() ;
??? printf ("\nHiding Mouse. . . " ) ;
??? regs. x. ax =? 2;
??? int86(0x33, &regs,? &regs);
??? printf("\nDone\n");
?}
當運行這個程序時,屏幕上會出現一個閃爍的可以移動的塊狀光標。無論什么時候,你都可以通過函數3向鼠標處理程序詢問鼠標的位置。實際上,筆者用表14.13中的函數編寫了一整套鼠標庫函數,并且在筆者的許多使用文本模式鼠標的程序中使用了這套函數。

為了使用上表中的函數,你必須安裝一種鼠標驅動程序。通常可以通過AUTOEXEC.BAT文件來安裝鼠標驅動程序。然而,現在運行Windows時通常只安裝一種Windows鼠標驅動程序,在這種情況下,你必須先運行在DOS shell下,然后才能調用這些鼠標函數。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/450482.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/450482.shtml
英文地址,請注明出處:http://en.pswp.cn/news/450482.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

hadoop生態搭建(3節點)-10.spark配置

# https://www.scala-lang.org/download/2.12.4.html# 安裝 scala tar -zxvf ~/scala-2.12.4.tgz -C /usr/local rm –r ~/scala-2.12.4.tgz # http://archive.apache.org/dist/spark/spark-2.3.0/ # 安裝 spark tar -zxf ~/spark-2.3.0-bin-hadoop2.7.tgz -C /usr/local mv /u…

持續集成coding

1、安裝docker yum -y install docker yum -y install composer yum -y install docker-compose 2、啟動docker服務 service docker start 3、測試安裝結果 docker-compose --version 4、創建目錄 mkdir /data/continus-deploy 5、寫入docker-compose.yml version: …

JSON字符串轉換為Map

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 本文是利用阿里巴巴封裝的FastJSON來轉換json字符串的。例子如下&#xff1a; [java] view plain copy package com.zkn.newlearn.json;…

排序與查找 詳細分析

C語言五種基本排序算法 程序員可以使用的基本排序算法有5種&#xff1a; 插入排序(insertionsort&#xff0e;)交換排序(exchangesOrt)選擇排序(selectionsort)歸并排序(mergesort)分布排序(distributionsort) 為了形象地解釋每種排序算法是怎樣工作的&#xff0c;讓我們來看…

《Netkiller Spring Cloud 手札》Spring boot 2.0 mongoTemplate 操作范例

2019獨角獸企業重金招聘Python工程師標準>>> 本文節選自 《Netkiller Spring Cloud 手札》 Netkiller Spring Cloud 手札 Spring Cloud Cookbook Mr. Neo Chan, 陳景峯(BG7NYT) 中國廣東省深圳市望海路半島城邦三期 518067 86 13113668890<netkillermsn.com> …

ZooKeeper原理及使用

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 ZooKeeper是Hadoop Ecosystem中非常重要的組件&#xff0c;它的主要功能是為分布式系統提供一致性協調(Coordination)服務&#xff0c;與…

自律只需要這篇文章

1. 鉆研&#xff0c;只要你有一個方面特別優秀&#xff0c;則在這個社會就足夠了,能夠吃一輩子 2. 領悟&#xff0c;需要的時候&#xff0c;別人給你只是一個具體的方向&#xff0c;具體的路還是要自己去設計 3. 執行力&#xff0c;晚上喜歡想想沒有小本本記錄&#xff0c;那么…

數據和文件操作

怎樣用C語言對某個目錄下的文件名進行排序? 在4&#xff0e;8的例子中&#xff0c;用_dos_findfirst()和_dos_findnext()函數遍歷目錄結構&#xff0c;每找到一個文件名&#xff0c;就把它打印在屏幕上&#xff0c;因此&#xff0c;文件名是逐個被找到并列出來的。當你對某個目…

這些年來什么才是最好的投資?

這些年&#xff0c;就是從我畢業&#xff08;2006&#xff09;以后... 聊投資&#xff0c;不免說股市&#xff1b;股市平時沒什么人談&#xff0c;一般暴漲暴跌時大家的談興就起來了。而最近這一周&#xff0c;全球股市都開啟了暴跌模式&#xff0c;讓投資者虧損慘重&#xff0…

electron安裝比較慢的方法

ELECTRON_MIRROR"https://cdn.npm.taobao.org/dist/electron/" npm install electron

vim 正則非貪婪模式

比如多匹配使用 .* 效果自然是貪婪模式&#xff0c;JS 的非貪婪很簡單&#xff0c;是 .*? 即可&#xff0c;而 vim 不同&#xff0c;語法是 .\{-}&#xff0c;注意 \ 轉義。 轉載于:https://www.cnblogs.com/ZweiZhao/p/10062543.html

循環結構 案例分析

怎樣才能知道循環是否提前結束了 循環通常依賴于一個或多個變量&#xff0c;你可以在循環外檢查這些變量&#xff0c;以確保循環被正確執行。請看下例&#xff1a;int xchar * cp[REQUESTED_BLOCKS]/ * Attempt (in vain, I must add... )toallocate 512 10KB blocks in memory…

工作中常用的但是又容易忽略的問題

個人平時總結 Document 對象 每個載入瀏覽器的 HTML 文檔都會成為 Document 對象。 Document 對象使我們可以從腳本中對 HTML 頁面中的所有元素進行訪問。 提$(document)是一個選擇器&#xff0c;選中的是整個html所有元素的集合示&#xff1a;Document 對象是 Window 對象的一…

JAVA經典面試題匯總(保存這篇就夠了)

一. java基礎篇 1.final 關鍵字的作用? 被 final 修飾的類不可以被繼承。被 final 修飾的方法不可以被重寫。被 final 修飾的變量不可以被改變&#xff0c;如果修飾引用&#xff0c;那么表示引用不可變&#xff0c;引用指向的內容可變。被 final 修飾的方法&#xff0c;JVM …

Angular5 *ngIf 和 hidden 的區別

問題 項目中遇到一個問題&#xff0c;有一個過濾查詢的面板&#xff0c;需要通過一個展開折疊的button&#xff0c;來控制它的show 和 hide。這個面板中&#xff0c;有一個Select 組件&#xff0c;一個 input 查詢輸入框。 原來代碼是&#xff1a; <div class"accordio…

ZooKeeper學習-- Zookeeper簡單介紹

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 一、分布式協調技術 在給大家介紹ZooKeeper之前先來給大家介紹一種技術——分布式協調技術。那么什么是分布式協調技術&#xff1f;那么…

選擇結構 案例分析

C語言goto&#xff0c;longjmp()和setjmp()之間有什么區別 goto語句實現程序執行中的近程跳轉(local jump)&#xff0c;longjmp()和setjmp()函數實現程序執行中的遠程跳轉(nonlocaljump&#xff0c;也叫farjump)。通常你應該避免任何形式的執行中跳轉&#xff0c;因為在程序中…

Python基礎班---第一部分(基礎)---Python基礎知識---第一個Python程序

01. 第一個 HelloPython 程序 1.1 Python 源程序的基本概念 Python 源程序就是一個特殊格式的文本文件&#xff0c;可以使用任意文本編輯軟件做 Python 的開發Python 程序的 文件擴展名 通常都是 .py1.2 演練步驟 在桌面下&#xff0c;新建 Python基礎1 目錄在 Python基礎1 目錄…

面試題-集合

1.JAVA 中數組和集合的區別 &#xff1f; &#xff08;1&#xff09;數組的長度是固定的&#xff0c;而集合長度是可以改變的。 &#xff08;2&#xff09;數組可以儲存基本數據類型和引用數據類型&#xff0c;而集合只能儲存引用數據類型&#xff08;也就是對象&#xff09;…