目前分類:程式筆記 (11)

瀏覽方式: 標題列表 簡短摘要
每個使用者的profile中 都會有一個暫存的目錄 我們可以放暫存檔在裡面
暫存檔的目錄除了可以在系統登錄(registry)中找到 也可用GetTempPath()來取得
window系統也提供GetTempFileName() 來簡單的取得暫存檔名字
以下為使用範例
CString tpath;
CString fname;
GetTempPath(128,tpath.GetBuffer(128));
tpath.ReleaseBuffer();
GetTempFileName(tpath,"tmp",0,fname.GetBuffer(128));
fname.ReleaseBuffer();
// 取得檔名放在fname 之後可開啟此檔案
GetTempPath()可傳入兩個參數第一個為字串buffer大小 第二個為buffer的位置
之後暫存區的目錄便會放在tpath中
GetTempFileName() 要傳入四個參數
第一個為暫存目錄位置 可由GetTempPath()取得
第二個為三個字元的識別碼 我們可以使用自己的識別碼來分別自己的暫存檔
第三個為暫存檔編號 這裡傳入0 系統便會自動幫我們編號 並且開啟檔案
第四個為取得暫存檔名的buffer 取得的暫存檔名包括了完整路徑


要注意的是 當GetTempFileName()執行完後 暫存檔便已經開啟了
我們可以使用CFile或其他方法去開啟fname所傳回的檔案
暫存檔系統並不會自動砍掉 若存放路徑為暫存路徑 則空間不夠時系統才會自動砍掉
若不是暫存路徑的話 該檔案需要自行刪除

freestyler 發表在 痞客邦 留言(0) 人氣()

Char 轉成 TCHAR的辦法
// ANSI(char) to Unicode(TCHAR)
char* temp = "測試";
int nIndex = MultiByteToWideChar(CP_ACP, 0, temp , -1, NULL, 0);
TCHAR *pUnicode = new TCHAR[nIndex + 1];
MultiByteToWideChar(CP_ACP, 0, temp , -1, pUnicode, nIndex);


// Unicode(WCHAR) to ANSI(char)
TCHAR *pUnicode = _T("你好");
int nIndex = WideCharToMultiByte(CP_ACP, 0, pUnicode, -1, NULL, 0, NULL, NULL);
char *temp = new char[nIndex + 1];
WideCharToMultiByte(CP_ACP, 0, pUnicode, -1, temp , nIndex, NULL, NULL);
delete pAnsi;

freestyler 發表在 痞客邦 留言(0) 人氣()

●為什麼要用不定參數寫Log API ?
每次在寫 Log 之前就要宣告一個字串,再用 sprintf 或 Format 來處理,實在不方便,還要去控制字串的宣告位置、次數,多次寫Log的位置都有相同的宣告,程式碼也變得難閱讀。
不如直接將 Format 參數帶入 API,再由 Log API 來處理字串,是更好的方法。

●做法說明
// 以下為資料來源與參考資料文章(Copy & Paste)
http://blog.yam.com/csylvia/article/17973254

先講解一下什麼是不定參數,
最知名的例子就是 printf(),
你可以這樣使用

printf( "Hello." );

也可以這樣使用

printf( "Hello %s", szName );
printf( "Hello %s, you have drunk %d cups of coffee", szName, iNumber );

函式中可以只有一條字串,
也可以字串後夾帶許多參數,
這樣的函式的定義當然不可能是這樣:

printf( char* string, char* param1 );
printf( char* string, char* param1, int param2 );
printf( char* string, int param1 );
...

這樣有幾百、幾千種組合啊?!=口=|||b

這就是「不定參數」發揮的地方了。

可以看到 printf 的 prototype:

int printf(const char *format [,argument]...);

那三個點就是表示不定參數(參數的個數、型態不限定)。

用法大家非常清楚,
那假如今天想寫一個接受不定參數的函式要怎麼做?

這就要應用到 va_arg()、va_end()、va_start() 三個 macro 來完成,
根據手邊的《C/C++》內的說明如下:
va_arg():它可以讓函數後面所接的引數不必維持固定的個數。第一次呼叫時,會傳回引數列最前面的第一個引數,接下來每次呼叫會自動傳回下一個引數內容。
va_end():當使用 va_arg() 完成取得所有引數內容後呼叫此 macro,通常是為了執行 return 動作。
va_start():在使用 va_arg() 前必須先呼叫此 macro,如此才能順利找到「不定引數列」的最前面內容。

此外還有幾個相關函式:
vfprintf():將 argument list 的內容輸出到資料流。
vprintf():將 argument list 的值寫到標準輸出(standard output)。
vsprintf():將 argument list 的值輸出到字串緩衝區(string buffer)。

--------------------------------------------------------------------------------------------------

/*
NAME:
    WriteLog(LPCTSTR sFormat, ...)
PARAMETER:
    sFormat : 傳入的 Format 字串
    ...     : Format 字串的參數
RETURN:
COMMENT:
*/
void CTekKLine::WriteLog(LPCTSTR sFormat, ...)
{
    va_list     pArgList;
    TCHAR       sBuffer[2048];
    FILE       *pFile;
    CString     sPath;
    CString     sTemp;
    CTime       tNow = CTime::GetCurrentTime();

    // 取出傳入的 Format
    va_start(pArgList, sFormat);
    _vsnwprintf(sBuffer, sizeof(sBuffer) / sizeof(TCHAR), sFormat, pArgList);
    va_end(pArgList);

    // 建立資料夾
    sPath = _T(".\\log");
    CreateDirectory(sPath, NULL);
   
    // 組成路徑
    sTemp.Format(_T("%s\\kline.log"), sPath);
    pFile = _tfopen(sTemp, _T("a+t"));
   
    // 寫入檔案
    sTemp.Format(_T("[%04d%02d%02d %02d:%02d:%02d] %s\n"),
                tNow.GetYear(), tNow.GetMonth(), tNow.GetDay(), tNow.GetHour(), tNow.GetMinute(), tNow.GetSecond(),
                sBuffer);
    _fputts(sTemp, pFile);
   
    fclose(pFile);
}

freestyler 發表在 痞客邦 留言(0) 人氣()

C/C++ 的volatile
C/C++中的volatile使用時機?

.不知各位對volatile(揮發性的)這個字陌不陌生? 我相信大家在一些程式或多或少都看
 過這個字眼, 但是究竟要在何種場合用它呢?
.當然一定是有需要, C/C++才會有這個保留字, 否則只是增加programmer的困擾而已
.有2兩個場合(I/O & multithread program), 供各位參考!
.請大家check自己的程式中(尤其是第2個場合), 若有的話請記得加上volatile

1. I/O, 假設有一程式片斷如下

       U8   *pPort;
       U8   i, j, k;
      
       pPort = (U8 *)0x800000;
   
       i = *pPort;     
       j = *pPort;     
       k = *pPort;     

    以上的i, j, k很有可能被compiler最佳化而導致產生
       i = j = k = *pPort;
    的code, 也就是說只從pPort讀取一次, 而產生 i = j = k 的結果, 但是原本的程式的目
    的是要從同一個I/O port讀取3次的值給不同的變數, i, j, k的值很可能不同(例如從此
    I/O port 讀取溫度), 因此i = j = k的結果不是我們所要的

    怎麼辦 => 用volatile, 將
       U8   *pPort;
    改為
       volatile U8   *pPort;

    告訴compiler, pPort變數具有揮發性的特性, 所以與它有關的程式碼請不要作最佳化動作. 因而  
       i = *pPort;     
       j = *pPort;     
       k = *pPort;     
    此三列程式所產生的code, 會真正地從pPort讀取三次, 從而產生正確的結果

2. Global variables in Multithread program
    => 這是在撰寫multithread program時最容易被忽略的一部份
    => 此原因所造成的bug通常相當難解決(因為不穩定)

    假設有以下程式片斷, thread 1 & thread 2共用一個global var: gData
        thread 1:                                thread 2:                               
                                                                                         
            ...                                      ....                                
            int  gData;                              extern int gData;                   
                                                                                         
            while (1)                                int  i, j, k;                       
            {                                                                            
                ....                                 for (i = 0; i < 1000; i++)
                gData = rand();                      {                                   
                .....                                    /* A */
            }                                            j = gData;                      
                                                         ....                            
            ....                                     }                                   

    在thread 2的for loop中, 聰明的compiler看到gData的值, 每次都重新從memory load到register,
    實在沒效率, 因此會產生如下的code(注意,tmp也可以更進一步的用register取代):
       tmp = gData;
       for (i = 0; i < 1000; i++           
       {                                   
           /* A */
           j = tmp;                      
           ....                            
       }                                   
    也就是gData只讀取一次, 這下子問題來了, 說明如下:
    .thread 2在執行for loop到j = gData的前一列(A)的時候(假設此時gData=tmp=5), 被切換到thread 1執行
    .在thread 1的while loop中透過gData = rand(), 對gData做了修改(假設改為1), 再切換回thread 2執行
    .繼續執行 j = gData, 產生j = 5的結果
    .但是正確的結果應該是 j = 1
    怎麼辦 => 也是用volatile,

    在thread 1中, 將
        int  gData;  
    改為
        volatile int  gData;  
   
    在thread 2中, 將
        extern int  gData;  
    改為
        extern volatile int  gData;  

freestyler 發表在 痞客邦 留言(19) 人氣()

[轉錄] "開機" 萬言書
作者:吳翠鳳 (Linda Wu)
http://www.msservermag.com.tw/technicwords/020919.aspx
http://www.msservermag.com.tw/technicwords/020926.aspx
http://www.msservermag.com.tw/technicwords/021003.aspx
http://www.msservermag.com.tw/technicwords/021010.aspx

freestyler 發表在 痞客邦 留言(0) 人氣()

簡單的說,如果你使用了某個function,那麼你就是call了一個function。如果系統或是函式是要求你給一個function pointer,這個function pointer指到一個實際的函式(多半這個函式是你自己寫的)。然後它會在適當的時間呼叫此function,則此function就是所謂的 callback function。因為這個function是被callback了。

freestyler 發表在 痞客邦 留言(0) 人氣()

sqlite官網

在VC++上的使用方法:
1.下載http://www.sqlite.org/sqlitedll-3_6_12.zip
2.壓縮檔內有sqlite3.dll和sqlite3.def,在命命列下利用LIB生成用於連結(LINK)的lib文件:sqlite3.lib和sqlite3.exp

PATH = D:\Program Files\Microsoft Visual Studio 9.0\VC\bin;%PATH%
PATH = D:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE;%PATH%
LIB /DEF:sqlite3.def /machine:IX86

3.下載http://www.sqlite.org/sqlite-source-3_6_12.zip
4.從source code裡得到sqlite3.h

wrapper的使用:
1..CppSQLite3
2. CppSQLite3U (unicode版本)

可以查閱更改sqlite DB的軟體: SQLite Administrator


freestyler 發表在 痞客邦 留言(0) 人氣()

MFC中PreTranslateMessage是GetMessage(...)函数的下一级操作,即GetMessage(...)从消息队列中获取消息后,交由PreTranslateMessage()处理,若其返回FALSE则再交给TranslateMessage和 DispatchMessage处理(进入WindowProc);
如果用SendMessage, 则消息直接交到WindowProc处理,所以GetMessage不会取得SendMessage的消息,当然PreTranslateMessage也就不会被调用。
如果用PostMessage,则消息进入消息队列,由GetMessage取得,PreTranslateMessage就有机会进行处理。

freestyler 發表在 痞客邦 留言(0) 人氣()

(1) 如何建立自动增长字段?

简短回答:声明为 INTEGER PRIMARY KEY 的列将会自动增长。

长一点的答案: 如果你声明表的一列为 INTEGER PRIMARY KEY,那么, 每当你在该列上插入一NULL值时, NULL自动被转换为一个比该列中最大值大1的一个整数,如果表是空的, 将会是1。 (如果是最大可能的主键 9223372036854775807,那个,将键值将是随机未使用的数。) 如,有下列表:

CREATE TABLE t1(
  a INTEGER PRIMARY KEY,
  b INTEGER
);

在该表上,下列语句

INSERT INTO t1 VALUES(NULL,123);

在逻辑上等价于:

INSERT INTO t1 VALUES((SELECT max(a) FROM t1)+1,123);

有一个新的API叫做 sqlite3_last_insert_rowid(), 它将返回最近插入的整数值。

注意该整数会比表中该列上的插入之前的最大值大1。 该键值在当前的表中是唯一的。但有可能与已从表中删除的值重叠。要想建立在整个表的生命周期中唯一的键值,需要在 INTEGER PRIMARY KEY 上增加AUTOINCREMENT声明。那么,新的键值将会比该表中曾能存在过的最大值大1。如果最大可能的整数值在数据表中曾经存在过,INSERT将会失败, 并返回SQLITE_FULL错误代码。


--------------------------------------------------------------------------------

(2)SQLite3支持何种数据类型?

NULL
INTEGER
REAL
TEXT
BLOB
但实际上,sqlite3也接受如下的数据类型:
smallint  16 位元的整数。
interger  32 位元的整数。
decimal(p,s)  p 精确值和 s 大小的十进位整数,精确值p是指全部有几个数(digits)大小值    ,s是指小数点後有几位数。如果没有特别指定,则系统会设为 p=5; s=0 。
float   32位元的实数。
double   64位元的实数。
char(n)   n 长度的字串,n不能超过 254。
varchar(n)  长度不固定且其最大长度为 n 的字串,n不能超过 4000。
graphic(n)  和 char(n) 一样,不过其单位是两个字元 double-bytes, n不能超过127。   这个形态是为了支援两个字元长度的字体,例如中文字。
vargraphic(n)  可变长度且其最大长度为 n 的双字元字串,n不能超过 2000。
date   包含了 年份、月份、日期。
time   包含了 小时、分钟、秒。
timestamp  包含了 年、月、日、时、分、秒、千分之一秒。

参见 http://www.sqlite.org/datatype3.html.
--------------------------------------------------------------------------------

(3)SQLite允许向一个integer型字段中插入字符串!

这是一个特性,而不是一个bug。SQLite不强制数据类型约束。 任何数据都可以插入任何列。你可以向一个整型列中插入任意长度的字符串,向布尔型列中插入浮点数,或者向字符型列中插入日期型值。 在 CREATE TABLE 中所指定的数据类型不会限制在该列中插入任何数据。任何列均可接受任意长度的字符串(只有一种情况除外: 标志为INTEGER PRIMARY KEY的列只能存储64位整数,当向这种列中插数据除整数以外的数据时,将会产生错误。

但SQLite确实使用声明的列类型来指示你所期望的格式。所以,例如你向一个整型列中插入字符串时,SQLite会试图将该字符串转换成一个整数。 如果可以转换,它将插入该整数;否则,将插入字符串。这种特性有时被称为 类型或列亲和性(type or column affinity).


--------------------------------------------------------------------------------

(4)为什么SQLite不允许在同一个表不同的两行上使用0和0.0作主键?

主键必须是数值类型,将主键改为TEXT型将不起作用。

每一行必须有一个唯一的主键。对于一个数值型列, SQLite认为 '0' 和 '0.0' 是相同的, 因为他们在作为整数比较时是相等的(参见上一问题)。 所以,这样值就不唯一了。


--------------------------------------------------------------------------------

(5)多个应用程序或一个应用程序的多个实例可以同时访问同一个数据库文件吗?

多个进程可同时打开同一个数据库。多个进程可以同时进行SELECT 操作,但在任一时刻,只能有一个进程对数据库进行更改。

SQLite 使用读、写锁控制对数据库的访问。(在Win95/98/ME等不支持读、 写锁的系统下,使用一个概率性的模拟来代替。)但使用时要注意:如果数据库文件存放于一个NFS文件系统上,这种锁机制可能不能正常工作。 这是因为 fcntl() 文件锁在很多NFS上没有正确的实现。在可能有多个进程同时访问数据库的时候,应该避免将数据库文件放到NFS上。 在Windows上,Microsoft的文档中说:如果使用 FAT 文件系统而没有运行 share.exe 守护进程,那么锁可能是不能正常使用的。那些在Windows上有很多经验的人告诉我:对于网络文件,文件锁的实现有好多Bug,是靠不住的。如果他们说的是对的,那么在两台或多台Windows机器间共享数据库可能会引起不期望的问题。

我们意识到,没有其它嵌入式的 SQL 数据库引擎能象 SQLite 这样处理如此多的并发。SQLite允许多个进程同时打开一个数据库,同时读一个数据库。当有任何进程想要写时,它必须在更新过程中锁住数据库文件。 但那通常只是几毫秒的时间。其它进程只需等待写进程干完活结束。典型地,其它嵌入式的SQL数据库引擎同时只允许一个进程连接到数据库。

但是,Client/Server数据库引擎(如 PostgreSQL, MySQL, 或 Oracle) 通常支持更高级别的并发,并且允许多个进程同时写同一个数据库。这种机制在Client/Server结构的数据库上是可能的, 因为总是有一个单一的服务器进程很好地控制、协调对数据库的访问。如果你的应用程序需要很多的并发,那么你应该考虑使用一个Client/Server 结构的数据库。但经验表明,很多应用程序需要的并发,往往比其设计者所想象的少得多。

当SQLite试图访问一个被其它进程锁住的文件时,缺省的行为是返回 SQLITE_BUSY。 可以在C代码中使用 sqlite3_busy_handler() 或 sqlite3_busy_timeout() API 函数调整这一行为。
---------------------------------------------------------------------------

(6)SQLite线程安全吗?

线程是魔鬼(Threads are evil)。 避免使用它们。

SQLite 是线程安全的。由于很多用户会忽略我们在上一段中给出的建议, 我们做出了这种让步。但是,为了达到线程安全,SQLite在编译时必须将 SQLITE_THREADSAFE 预处理宏置为1。在Windows和Linux上, 已编译的好的二进制发行版中都是这样设置的。如果不确定你所使用的库是否是线程安全的,可以调用 sqlite3_threadsafe() 接口找出。

在 3.3.1 版本之前,一个 sqlite3 结构只能被用于调用 sqlite3_open 创建的同一线程。你不能在一个线程中打开数据库,然后将数据库句柄传递给另外一个进程使用。 这主要是由于在好多通用的线程实现(如RedHat9)中的限制引起的(是Bug吗?)。特别的,在有问题的系统上,一个进程创建的 fcntl() 锁无法被其它线程清除或修改。 所以,由于 SQLite 大量使用 fcntl() 锁做并发控制, 如果你在不同的线程间移动数据库连接,就可能会出现严重的问题。

在3.3.1版本上,关于在线程间移动数据库连接的限制变得宽松了。 在它及以后的版本中,只要连接没有持有 fcntl() 锁,在线程间移动句柄是安全的。 如果没有未决的事务,并且所有的语句都已执行完毕, 你就可以安全的假定不再持有任何锁。

在UNIX中,在执行 fork() 系统调用时不应携带已打开的数据库进入子进程。 那样做将会有问题。


--------------------------------------------------------------------------------

(7)在SQLite数据库中如何列出所有的表和索引?

如果你运行 sqlite3 命令行来访问你的数据库,可以键入 “.tables”来获得所有表的列表。或者,你可以输入 “.schema” 来看整个数据库模式,包括所有的表的索引。 输入这些命令,后面跟一个LIKE模式匹配可以限制显示的表。

在一个 C/C++ 程序中(或者脚本语言使用 Tcl/Ruby/Perl/Python 等) 你可以在一个特殊的名叫 SQLITE_MASTER 上执行一个SELECT查询以获得所有 表的索引。每一个 SQLite 数据库都有一个叫 SQLITE_MASTER 的表,它定义数据库的模式。 SQLITE_MASTER 表看起来如下:

CREATE TABLE sqlite_master (
  type TEXT,
  name TEXT,
  tbl_name TEXT,
  rootpage INTEGER,
  sql TEXT
);

对于表来说,type 字段永远是 'table',name 字段永远是表的名字。所以,要获得数据库中所有表的列表, 使用下列SELECT语句:

SELECT name FROM sqlite_master
WHERE type='table'
ORDER BY name;

对于索引,type 等于 'index', name 则是索引的名字,tbl_name 是该索引所属的表的名字。 不管是表还是索引,sql 字段是原先用 CREATE TABLE 或 CREATE INDEX 语句创建它们时的命令文本。对于自动创建的索引(用来实现 PRIMARY KEY 或 UNIQUE 约束),sql字段为NULL。

SQLITE_MASTER 表是只读的。不能对它使用 UPDATE、INSERT 或 DELETE。 它会被 CREATE TABLE、CREATE INDEX、DROP TABLE 和 DROP INDEX 命令自动更新。

临时表不会出现在 SQLITE_MASTER 表中。临时表及其索引和触发器存放在另外一个叫 SQLITE_TEMP_MASTER 的表中。SQLITE_TEMP_MASTER 跟 SQLITE_MASTER 差不多,但它只是对于创建那些临时表的应用可见。如果要获得所有表的列表, 不管是永久的还是临时的,可以使用类似下面的命令:

SELECT name FROM
   (SELECT * FROM sqlite_master UNION ALL
    SELECT * FROM sqlite_temp_master)
WHERE type='table'
ORDER BY name


--------------------------------------------------------------------------------

(8) SQLite数据库有已知的大小限制吗?

在 Windows 和 Unix 下,版本 2.7.4的 SQLite 可以达到 2的41次方字节 (2T 字节)。老版本的为 2的31 次方字节(2G 字节)。
SQLite 版本 2.8 限制一个记录的容量为 1M。SQLite 版本 3.0 则对单个记录容量没有限制。
表名、索引表名、视图名、触发器名和字段名没有长度限制。但 SQL 函数的名称 (由 sqlite3_create_function() API 函数创建) 不得超过 255 个字符。

对有关SQLite限制的详细讨论,见 limits.html 。


--------------------------------------------------------------------------------

(9) 在SQLite中,VARCHAR字段最长是多少?

SQLite 不强制 VARCHAR 的长度。 你可以在 SQLITE 中声明一个 VARCHAR(10),SQLite还是可以很高兴地允许你放入500个字符。 并且这500个字符是原封不动的,它永远不会被截断。


--------------------------------------------------------------------------------

(10) SQLite支持二进制大对象吗?

SQLite 3.0 及以后版本允许你在任何列中存储 BLOB 数据。 即使该列被声明为其它类型也可以。


--------------------------------------------------------------------------------

(11) 在SQLite中,如何在一个表上添加或删除一列?

SQLite 有有限地 ALTER TABLE 支持。你可以使用它来在表的末尾增加一列,可更改表的名称。 如果需要对表结构做更复杂的改变,则必须重新建表。 重建时可以先将已存在的数据放到一个临时表中,删除原表, 创建新表,然后将数据从临时表中复制回来。

如,假设有一个 t1 表,其中有 "a", "b", "c" 三列, 如果要删除列 c ,以下过程描述如何做:

BEGIN TRANSACTION;
CREATE TEMPORARY TABLE t1_backup(a,b);
INSERT INTO t1_backup SELECT a,b FROM t1;
DROP TABLE t1;
CREATE TABLE t1(a,b);
INSERT INTO t1 SELECT a,b FROM t1_backup;
DROP TABLE t1_backup;
COMMIT;


--------------------------------------------------------------------------------

(12) 我在数据库中删除了很多数据,但数据库文件没有变小,是Bug吗?

不是。当你从SQLite数据库中删除数据时, 未用的磁盘空间将会加入一个内部的“自由列表”中。 当你下次插入数据时,这部分空间可以重用。磁盘空间不会丢失, 但也不会返还给操作系统。

如果删除了大量数据,而又想缩小数据库文件占用的空间,执行 VACUUM 命令。 VACUUM 将会从头重新组织数据库。这将会使用数据库有一个空的“自由链表”, 数据库文件也会最小。但要注意的是,VACUUM 的执行会需要一些时间(在SQLite开发时,在Linux上,大约每M字节需要半秒种),并且, 执行过程中需要原数据库文件至多两倍的临时磁盘空间。

对于 SQLite 3.1版本,一个 auto-vacumm 模式可以替代 VACUUM 命令。 可以使用 auto_vacuum pragma 打开。


--------------------------------------------------------------------------------

(13) 我可以在商业产品中使用SQLite而不需支付许可费用吗?

是的。SQLite 在 public domain。 对代码的任何部分没有任何所有权声明。你可以使用它做任何事。


--------------------------------------------------------------------------------

(14) 如何在字符串中使用单引号(')?

SQL 标准规定,在字符串中,单引号需要使用逃逸字符,即在一行中使用两个单引号。在这方面 SQL 用起来类似 Pascal 语言。 SQLite 尊循标准。如:

    INSERT INTO xyz VALUES('5 O''clock');
 

--------------------------------------------------------------------------------

(15) SQLITE_SCHEMA error是什么错误?为什么会出现该错误?

当一个准备好的(prepared)SQL语句不再有效或者无法执行时, 将返回一个 SQLITE_SCHEMA 错误。发生该错误时,SQL语句必须使用 sqlite3_prepare() API来重新编译. 在 SQLite 3 中, 一个 SQLITE_SCHEMA 错误只会发生在用 sqlite3_prepare()/sqlite3_step()/sqlite3_finalize() API 执行 SQL 时。而不会发生在使用 sqlite3_exec()时。 在版本2中不是这样。

准备好的语句失效的最通常原因是:在语句准备好后, 数据库的模式又被修改了。另外的原因会发生在:

数据库离线:DETACHed.
数据库被 VACUUMed
一个用户存储过程定义被删除或改变。
一个 collation 序列定义被删除或改变。
认证函数被改变。
在所有情况下,解决方法是重新编译并执行该SQL语句。 因为一个已准备好的语句可以由于其它进程改变数据库模式而失效, 所有使用 sqlite3_prepare()/sqlite3_step()/sqlite3_finalize() API 的代码都应准备处理 SQLITE_SCHEMA 错误。下面给出一个例子:

    int rc;
    sqlite3_stmt *pStmt;
    char zSql[] = "SELECT .....";

    do {
      /* Compile the statement from SQL. Assume success. */
      sqlite3_prepare(pDb, zSql, -1, &pStmt, 0);

      while( SQLITE_ROW==sqlite3_step(pStmt) ){
        /* Do something with the row of available data */
      }

      /* Finalize the statement. If an SQLITE_SCHEMA error has
      ** occured, then the above call to sqlite3_step() will have
      ** returned SQLITE_ERROR. sqlite3_finalize() will return
      ** SQLITE_SCHEMA. In this case the loop will execute again.
      */
      rc = sqlite3_finalize(pStmt);
    } while( rc==SQLITE_SCHEMA );
   
 

--------------------------------------------------------------------------------

(16) 为什么 ROUND(9.95,1) 返回 9.9 而不是 10.0? 9.95不应该圆整 (四舍五入)吗?

SQLite 使用二进制算术,在二进制中, 无法用有限的二进制位数表示 9.95 。使用 64-bit IEEE 浮点 (SQLite就是使用这个)最接近 9.95 的二进制表示是 9.949999999999999289457264239899814128875732421875。所在,当你输入 9.95 时,SQLite实际上以为是上面的数字, 在四舍五入时会舍去。

这种问题在使用二进制浮点数的任何时候都会出现。 通常的规则是记住很多有限的十进制小数都没有一个对应的二进制表示。 所以,它们只能使用最接近的二进制数。它们通常非常接近, 但也会有些微小的不同,有些时候也会导致你所期望的不同的结果。

freestyler 發表在 痞客邦 留言(0) 人氣()

//------------------------------------------

bool RssTreeView::LoadXmlToTree(LPCWSTR xmlFileName)
{
 if(PathFileExists(xmlFileName) == TRUE)
 {
  if ( SUCCEEDED(CoInitialize(NULL)) )
  {
   MSXML2::IXMLDOMDocument *pDoc;
   if ( SUCCEEDED (CoCreateInstance(MSXML2::CLSID_DOMDocument,
              NULL,
              CLSCTX_INPROC_SERVER,
              MSXML2::IID_IXMLDOMDocument,
              reinterpret_cast<void**>(&pDoc))))
   {
    //
    // Tell the "doc" that we're not going to load asynchronously.
    //
    if ( SUCCEEDED(pDoc->put_async(VARIANT_FALSE)) )
    {
     CComVariant vFile(RssDefaultNewsPath);
     VARIANT_BOOL vBool;
     pDoc->load(vFile,&vBool);
     if ( vBool == VARIANT_TRUE )
     {
      MSXML2::IXMLDOMNodePtr pRootNode;
      pDoc->selectSingleNode(_T("root"), &pRootNode); //取得根節點
      if(pRootNode == NULL)
       return  false;

      BSTR sRoot;
      pRootNode->get_nodeName(&sRoot);
      HTREEITEM root = GetTreeCtrl().InsertItem(sRoot, GetTreeCtrl().GetRootItem()); //加入根節點
 
      XmlNodeToTreeNode(root, pRootNode);

      pRootNode = NULL;
     }
     else
      ManageDB::CheckLoad(pDoc);
    }
    pDoc->Release();
    pDoc = NULL;
   }
   CoUninitialize();
  }
  return true;
 }
 else
  return false;
}

void RssTreeView::XmlNodeToTreeNode(HTREEITEM parentItem, MSXML2::IXMLDOMNodePtr pXmlNode)
{
 BSTR nodeType;
 MSXML2::IXMLDOMNodeListPtr pXMLNodeList;
 long count;
 BSTR sNode;

 pXmlNode->get_nodeTypeString(&nodeType);
 
 if(!wcscmp(nodeType, _T("text")))   //NODE類型涵義請查MSDN
  return;
 
 pXmlNode->get_childNodes(&pXMLNodeList);
 
 pXMLNodeList->get_length(&count); //子節點個數

 if(count==0)
 {
  //沒有子節點,則設置父節點名
  pXmlNode->get_nodeName(&sNode);
  GetTreeCtrl().SetItemText(parentItem, sNode);
  return;
 }

 
 for(int i=0; i<count; i++)
 {
  MSXML2::IXMLDOMNodePtr childNode;
  pXMLNodeList->get_item(i, &childNode);
  HTREEITEM subItem;

  childNode->get_nodeTypeString(&nodeType);
  if(!wcscmp(nodeType, _T("text")))
  {
   //是text,加節點值
   childNode->get_text(&sNode);
   subItem = GetTreeCtrl().InsertItem(sNode, parentItem);
  }
  else
  {
   //非text,加節點名
   childNode->get_nodeName(&sNode);
   subItem = GetTreeCtrl().InsertItem(sNode, parentItem);
   
   //若是沒有值的非葉子節點,就加一個空子值
   VARIANT_BOOL hasChild;
   childNode->hasChildNodes(&hasChild);
   if(sNode && wcslen(sNode) && !hasChild)
    GetTreeCtrl().InsertItem(_T(""), subItem);
  }
  XmlNodeToTreeNode(subItem, childNode); //遞迴子節點
 }
}

bool RssTreeView::SaveTreeToXml(LPCWSTR xmlFileName)
{
 CoInitialize(NULL);
 MSXML2::IXMLDOMDocument2Ptr pXMLDom;
 HRESULT hr = pXMLDom.CreateInstance(__uuidof(DOMDocument40));
 if(FAILED(hr))
 {
  return FALSE;
 }
 pXMLDom->put_async(VARIANT_FALSE);   // default-true
 
 //加入頭訊息
 MSXML2::IXMLDOMProcessingInstructionPtr pPI = NULL;
 pXMLDom->createProcessingInstruction(_T("xml"), _T("version='1.0'   encoding='unicode'"), &pPI);
 _variant_t vNullVal;
 vNullVal.vt = VT_NULL;
 MSXML2::IXMLDOMNodePtr tmpNode;
 pXMLDom->insertBefore(pPI, vNullVal, &tmpNode);
 
 HTREEITEM rootItem = GetTreeCtrl().GetRootItem();
 
 //將樹的根加入dom
 MSXML2::IXMLDOMNodePtr pRootNode;
 pXMLDom->createNode(_variant_t((short)MSXML2::NODE_ELEMENT),
 _bstr_t(GetTreeCtrl().GetItemText(rootItem)),
 _bstr_t(_T("")),
 &pRootNode);

 pXMLDom->appendChild(pRootNode, &tmpNode);
 
 TreeNodeToXmlNode(rootItem, pXMLDom, pRootNode);
 
 pXMLDom->save(_variant_t(xmlFileName));

 CoUninitialize();
 
 return TRUE;
}

void RssTreeView::TreeNodeToXmlNode(HTREEITEM parentItem, MSXML2::IXMLDOMDocument2Ptr pXMLDom, MSXML2::IXMLDOMNodePtr pXmlNode)
{
 if(!GetTreeCtrl().ItemHasChildren(parentItem))
 {
  return;
 }
 
 MSXML2::IXMLDOMNodePtr pChildNode;
 HTREEITEM hChildItem = GetTreeCtrl().GetChildItem(parentItem);//得到parentItem下所有子節點
 
 while (hChildItem != NULL)
 {
  CString szText = GetTreeCtrl().GetItemText(hChildItem);
  if(!GetTreeCtrl().ItemHasChildren(hChildItem))   //子為葉子
  {
   MSXML2::IXMLDOMTextPtr pText;
   pXMLDom->createTextNode(_bstr_t(szText), &pText);
   pXmlNode->appendChild(pText, &pChildNode);   //puttext
  }
  else //子又有子
  {
   pXMLDom->createNode(_variant_t((short)MSXML2::NODE_ELEMENT), _bstr_t(_bstr_t(szText)), _bstr_t(_T("")), &pChildNode); 
   
   MSXML2::IXMLDOMNodePtr tmpNode;
   pXmlNode->appendChild(pChildNode, &tmpNode);
   TreeNodeToXmlNode(hChildItem, pXMLDom, pChildNode);   //遞迴
  }
  hChildItem = GetTreeCtrl().GetNextItem(hChildItem, TVGN_NEXT);
 }

   

 

freestyler 發表在 痞客邦 留言(0) 人氣()

 

Generic SBCS UNICODE
TCHAR char wchar_t
_TEOF EOF WEOF
_TINT int wint_t
_TSCHAR signed char wchar_t
_TUCHAR unsigned char wchar_t
_TXCHAR char wchar_t
__T(x) x L
__targv __argv __wargv
__tcserror _strerror __wcserror
__tcserror_s _strerror_s __wcserror_s
_cgetts _cgets _cgetws
_cgetts_s _cgets_s _cgetws_s
_cputts _cputs _cputws
_fgettc fgetc fgetwc
_fgettc_nolock _fgetc_nolock _fgetwc_nolock
_fgettchar _fgetchar _fgetwchar
_fgetts fgets fgetws
_fputtc fputc fputwc
_fputtc_nolock _fputc_nolock _fputwc_nolock
_fputtchar _fputchar _fputwchar
_fputts fputs fputws
_ftprintf fprintf fwprintf
_ftprintf_l _fprintf_l _fwprintf_l
_ftprintf_p _fprintf_p _fwprintf_p
_ftprintf_p_l _fprintf_p_l _fwprintf_p_l
_ftprintf_s fprintf_s fwprintf_s
_ftprintf_s_l _fprintf_s_l _fwprintf_s_l
_ftscanf fscanf fwscanf
_ftscanf_l _fscanf_l _fwscanf_l
_ftscanf_s fscanf_s fwscanf_s
_ftscanf_s_l _fscanf_s_l _fwscanf_s_l
_get_tpgmptr _get_pgmptr _get_wpgmptr
_gettc getc getwc
_gettc_nolock _getc_nolock _getwc_nolock
_gettch _getch _getwch
_gettch_nolock _getch_nolock _getwch_nolock
_gettchar getchar getwchar
_gettchar_nolock _getchar_nolock _getwchar_nolock
_gettche _getche _getwche
_gettche_nolock _getche_nolock _getwche_nolock
_getts gets _getws
_getts_s gets_s _getws_s
_i64tot _i64toa _i64tow
_i64tot_s _i64toa_s _i64tow_s
_istalnum isalnum iswalnum
_istalnum_l _isalnum_l _iswalnum_l
_istalpha isalpha iswalpha
_istalpha_l _isalpha_l _iswalpha_l
_istascii __isascii iswascii
_istcntrl iscntrl iswcntrl
_istcntrl_l _iscntrl_l _iswcntrl_l
_istdigit isdigit iswdigit
_istdigit_l _isdigit_l _iswdigit_l
_istgraph isgraph iswgraph
_istgraph_l _isgraph_l _iswgraph_l
_istlower islower iswlower
_istlower_l _islower_l _iswlower_l
_istprint isprint iswprint
_istprint_l _isprint_l _iswprint_l
_istpunct ispunct iswpunct
_istpunct_l _ispunct_l _iswpunct_l
_istspace isspace iswspace
_istspace_l _isspace_l _iswspace_l
_istupper isupper iswupper
_istupper_l _isupper_l _iswupper_l
_istxdigit isxdigit iswxdigit
_istxdigit_l _isxdigit_l _iswxdigit_l
_itot _itoa _itow
_itot_s _itoa_s _itow_s
_ltot _ltoa _ltow
_ltot_s _ltoa_s _ltow_s
_puttc putc putwc
_puttc_nolock _putc_nolock _putwc_nolock
_puttch _putch _putwch
_puttch_nolock _putch_nolock _putwch_nolock
_puttchar putchar putwchar
_puttchar_nolock _putchar_nolock _putwchar_nolock
_putts puts _putws
_sctprintf _scprintf _scwprintf
_sctprintf_l _scprintf_l _scwprintf_l
_sctprintf_p _scprintf_p _scwprintf_p
_sctprintf_p_l _scprintf_p_l _scwprintf_p_l
_sntprintf _snprintf _snwprintf
_sntprintf_l _snprintf_l _snwprintf_l
_sntprintf_s _snprintf_s _snwprintf_s
_sntprintf_s_l _snprintf_s_l _snwprintf_s_l
_sntscanf _snscanf _snwscanf
_sntscanf_l _snscanf_l _snwscanf_l
_sntscanf_s _snscanf_s _snwscanf_s
_sntscanf_s_l _snscanf_s_l _snwscanf_s_l
_stprintf sprintf _swprintf
_stprintf_l _sprintf_l __swprintf_l
_stprintf_p _sprintf_p _swprintf_p
_stprintf_p_l _sprintf_p_l _swprintf_p_l
_stprintf_s sprintf_s swprintf_s
_stprintf_s_l _sprintf_s_l _swprintf_s_l
_stscanf sscanf swscanf
_stscanf_l _sscanf_l _swscanf_l
_stscanf_s sscanf_s swscanf_s
_stscanf_s_l _sscanf_s_l _swscanf_s_l
_tWinMain WinMain wWinMain
_taccess _access _waccess
_taccess_s _access_s _waccess_s
_tasctime asctime _wasctime
_tasctime_s asctime_s _wasctime_s
_tchdir _chdir _wchdir
_tchmod _chmod _wchmod
_tcprintf _cprintf _cwprintf
_tcprintf_l _cprintf_l _cwprintf_l
_tcprintf_p _cprintf_p _cwprintf_p
_tcprintf_p_l _cprintf_p_l _cwprintf_p_l
_tcprintf_s _cprintf_s _cwprintf_s
_tcprintf_s_l _cprintf_s_l _cwprintf_s_l
_tcreat _creat _wcreat
_tcscanf _cscanf _cwscanf
_tcscanf_l _cscanf_l _cwscanf_l
_tcscanf_s _cscanf_s _cwscanf_s
_tcscanf_s_l _cscanf_s_l _cwscanf_s_l
_tcscat strcat wcscat
_tcscat_s strcat_s wcscat_s
_tcschr strchr wcschr
_tcsclen strlen wcslen
_tcscmp strcmp wcscmp
_tcscnlen strnlen wcsnlen
_tcscoll strcoll wcscoll
_tcscoll_l _strcoll_l _wcscoll_l
_tcscpy strcpy wcscpy
_tcscpy_s strcpy_s wcscpy_s
_tcscspn strcspn wcscspn
_tcsdec _strdec _wcsdec
_tcsdup _strdup _wcsdup
_tcsdup_dbg _strdup_dbg  
_tcserror strerror _wcserror
_tcserror_s strerror_s _wcserror_s
_tcsftime strftime wcsftime
_tcsftime_l _strftime_l _wcsftime_l
_tcsicmp _stricmp _wcsicmp
_tcsicmp_l _stricmp_l _wcsicmp_l
_tcsicoll _stricoll _wcsicoll
_tcsicoll_l _stricoll_l _wcsicoll_l
_tcsinc _strinc _wcsinc
_tcslen strlen wcslen
_tcslwr _strlwr _wcslwr
_tcslwr_l _strlwr_l _wcslwr_l
_tcslwr_s _strlwr_s _wcslwr_s
_tcslwr_s_l _strlwr_s_l _wcslwr_s_l
_tcsnbcnt _strncnt _wcsncnt
_tcsncat strncat wcsncat
_tcsncat_l _strncat_l _wcsncat_l
_tcsncat_s strncat_s wcsncat_s
_tcsncat_s_l _strncat_s_l _wcsncat_s_l
_tcsnccat strncat wcsncat
_tcsnccat_l _strncat_l _wcsncat_l
_tcsnccat_s strncat_s wcsncat_s
_tcsnccat_s_l _strncat_s_l _wcsncat_s_l
_tcsnccmp strncmp wcsncmp
_tcsnccnt _strncnt _wcsncnt
_tcsnccoll _strncoll _wcsncoll
_tcsnccoll_l _strncoll_l _wcsncoll_l
_tcsnccpy strncpy wcsncpy
_tcsnccpy_l _strncpy_l _wcsncpy_l
_tcsnccpy_s strncpy_s wcsncpy_s
_tcsnccpy_s_l _strncpy_s_l _wcsncpy_s_l
_tcsncicmp _strnicmp _wcsnicmp
_tcsncicmp_l _strnicmp_l _wcsnicmp_l
_tcsncicoll _strnicoll _wcsnicoll
_tcsncicoll_l _strnicoll_l _wcsnicoll_l
_tcsncmp strncmp wcsncmp
_tcsncoll _strncoll _wcsncoll
_tcsncoll_l _strncoll_l _wcsncoll_l
_tcsncpy strncpy wcsncpy
_tcsncpy_l _strncpy_l _wcsncpy_l
_tcsncpy_s strncpy_s wcsncpy_s
_tcsncpy_s_l _strncpy_s_l _wcsncpy_s_l
_tcsncset _strnset _wcsnset
_tcsnextc _strnextc _wcsnextc
_tcsnicmp _strnicmp _wcsnicmp
_tcsnicmp_l _strnicmp_l _wcsnicmp_l
_tcsnicoll _strnicoll _wcsnicoll
_tcsnicoll_l _strnicoll_l _wcsnicoll_l
_tcsninc _strninc _wcsninc
_tcsnlen strnlen wcsnlen
_tcsnset _strnset _wcsnset
_tcsnset_l _strnset_l _wcsnset_l
_tcsnset_s _strnset_s _wcsnset_s
_tcsnset_s_l _strnset_s_l _wcsnset_s_l
_tcspbrk strpbrk wcspbrk
_tcsrchr strrchr wcsrchr
_tcsrev _strrev _wcsrev
_tcsset _strset _wcsset
_tcsset_l   _wcsset_l
_tcsset_s _strset_s _wcsset_s
_tcsset_s_l _strset_s_l _wcsset_s_l
_tcsspn strspn wcsspn
_tcsspnp _strspnp _wcsspnp
_tcsstr strstr wcsstr
_tcstod strtod wcstod
_tcstod_l _strtod_l _wcstod_l
_tcstoi64 _strtoi64 _wcstoi64
_tcstoi64_l _strtoi64_l _wcstoi64_l
_tcstok strtok wcstok
_tcstok_l _strtok_l _wcstok_l
_tcstok_s strtok_s wcstok_s
_tcstok_s_l _strtok_s_l _wcstok_s_l
_tcstol strtol wcstol
_tcstol_l _strtol_l _wcstol_l
_tcstoui64 _strtoui64 _wcstoui64
_tcstoui64_l _strtoui64_l _wcstoui64_l
_tcstoul strtoul wcstoul
_tcstoul_l _strtoul_l _wcstoul_l
_tcsupr _strupr _wcsupr
_tcsupr_l _strupr_l _wcsupr_l
_tcsupr_s _strupr_s _wcsupr_s
_tcsupr_s_l _strupr_s_l _wcsupr_s_l
_tcsxfrm strxfrm wcsxfrm
_tcsxfrm_l _strxfrm_l _wcsxfrm_l
_tctime ctime _wctime
_tctime32 _ctime32 _wctime32
_tctime32_s _ctime32_s _wctime32_s
_tctime64 _ctime64 _wctime64
_tctime64_s _ctime64_s _wctime64_s
_tctime_s ctime_s _wctime_s
_tdupenv_s _dupenv_s _wdupenv_s
_tdupenv_s_dbg _dupenv_s_dbg _wdupenv_s_dbg
_tenviron _environ _wenviron
_texecl _execl _wexecl
_texecle _execle _wexecle
_texeclp _execlp _wexeclp
_texeclpe _execlpe _wexeclpe
_texecv _execv _wexecv
_texecve _execve _wexecve
_texecvp _execvp _wexecvp
_texecvpe _execvpe _wexecvpe
_tfdopen _fdopen _wfdopen
_tfinddata32_t _finddata32_t _wfinddata32_t
_tfinddata32i64_t _finddata32i64_t _wfinddata32i64_t
_tfinddata64_t __finddata64_t _wfinddata64_t
_tfinddata64i32_t _finddata64i32_t _wfinddata64i32_t
_tfinddata_t _finddata_t _wfinddata_t
_tfinddatai64_t _finddatai64_t _wfinddatai64_t
_tfindfirst _findfirst _wfindfirst
_tfindfirst32 _findfirst32 _wfindfirst32
_tfindfirst32i64 _findfirst32i64 _wfindfirst32i64
_tfindfirst64 _findfirst64 _wfindfirst64
_tfindfirst64i32 _findfirst64i32 _wfindfirst64i32
_tfindfirsti64 _findfirsti64 _wfindfirsti64
_tfindnext _findnext _wfindnext
_tfindnext32 _findnext32 _wfindnext32
_tfindnext32i64 _findnext32i64 _wfindnext32i64
_tfindnext64 _findnext64 _wfindnext64
_tfindnext64i32 _findnext64i32 _wfindnext64i32
_tfindnexti64 _findnexti64 _wfindnexti64
_tfopen fopen _wfopen
_tfopen_s fopen_s _wfopen_s
_tfreopen freopen _wfreopen
_tfreopen_s freopen_s _wfreopen_s
_tfsopen _fsopen _wfsopen
_tfullpath _fullpath _wfullpath
_tfullpath_dbg _fullpath_dbg _wfullpath_dbg
_tgetcwd _getcwd _wgetcwd
_tgetcwd_dbg _getcwd_dbg _wgetcwd_dbg
_tgetdcwd _getdcwd _wgetdcwd
_tgetdcwd_dbg _getdcwd_dbg _wgetdcwd_dbg
_tgetdcwd_lk_dbg _getdcwd_lk_dbg _wgetdcwd_lk_dbg
_tgetdcwd_nolock _getdcwd_nolock _wgetdcwd_nolock
_tgetenv getenv _wgetenv
_tgetenv_s getenv_s _wgetenv_s
_tmain main wmain
_tmakepath _makepath _wmakepath
_tmakepath_s _makepath_s _wmakepath_s
_tmkdir _mkdir _wmkdir
_tmktemp _mktemp _wmktemp
_tmktemp_s _mktemp_s _wmktemp_s
_topen _open _wopen
_totlower tolower towlower
_totlower_l _tolower_l _towlower_l
_totupper toupper towupper
_totupper_l _toupper_l _towupper_l
_tperror perror _wperror
_tpgmptr _pgmptr _wpgmptr
_tpopen _popen _wpopen
_tprintf printf wprintf
_tprintf_l _printf_l _wprintf_l
_tprintf_p _printf_p _wprintf_p
_tprintf_p_l _printf_p_l _wprintf_p_l
_tprintf_s printf_s wprintf_s
_tprintf_s_l _printf_s_l _wprintf_s_l
_tputenv _putenv _wputenv
_tputenv_s _putenv_s _wputenv_s
_tremove remove _wremove
_trename rename _wrename
_trmdir _rmdir _wrmdir
_tscanf scanf wscanf
_tscanf_l _scanf_l _wscanf_l
_tscanf_s scanf_s wscanf_s
_tscanf_s_l _scanf_s_l _wscanf_s_l
_tsearchenv _searchenv _wsearchenv
_tsearchenv_s _searchenv_s _wsearchenv_s
_tsetlocale setlocale _wsetlocale
_tsopen _sopen _wsopen
_tsopen_s _sopen_s _wsopen_s
_tspawnl _spawnl _wspawnl
_tspawnle _spawnle _wspawnle
_tspawnlp _spawnlp _wspawnlp
_tspawnlpe _spawnlpe _wspawnlpe
_tspawnv _spawnv _wspawnv
_tspawnve _spawnve _wspawnve
_tspawnvp _spawnvp _wspawnvp
_tspawnvpe _spawnvpe _wspawnvpe
_tsplitpath _splitpath _wsplitpath
_tsplitpath_s _splitpath_s _wsplitpath_s
_tstat _stat _wstat
_tstat32 _stat32 _wstat32
_tstat32i64 _stat32i64 _wstat32i64
_tstat64 _stat64 _wstat64
_tstat64i32 _stat64i32 _wstat64i32
_tstati64 _stati64 _wstati64
_tstof atof _wtof
_tstof_l _atof_l _wtof_l
_tstoi atoi _wtoi
_tstoi64 _atoi64 _wtoi64
_tstoi64_l _atoi64_l _wtoi64_l
_tstoi_l _atoi_l _wtoi_l
_tstol atol _wtol
_tstol_l _atol_l _wtol_l
_tstrdate _strdate _wstrdate
_tstrdate_s _strdate_s _wstrdate_s
_tstrtime _strtime _wstrtime
_tstrtime_s _strtime_s _wstrtime_s
_tsystem system _wsystem
_ttempnam _tempnam _wtempnam
_ttempnam_dbg _tempnam_dbg _wtempnam_dbg
_ttmpnam tmpnam _wtmpnam
_ttmpnam_s tmpnam_s _wtmpnam_s
_ttoi atoi _wtoi
_ttoi64 _atoi64 _wtoi64
_ttol atol _wtol
_tunlink _unlink _wunlink
_tutime _utime _wutime
_tutime32 _utime32 _wutime32
_tutime64 _utime64 _wutime64
_ui64tot _ui64toa _ui64tow
_ui64tot_s _ui64toa_s _ui64tow_s
_ultot _ultoa _ultow
_ultot_s _ultoa_s _ultow_s
_ungettc ungetc ungetwc
_ungettc_nolock _ungetc_nolock _ungetwc_nolock
_ungettch _ungetch _ungetwch
_ungettch_nolock _ungetch_nolock _ungetwch_nolock
_vftprintf vfprintf vfwprintf
_vftprintf_l _vfprintf_l _vfwprintf_l
_vftprintf_p _vfprintf_p _vfwprintf_p
_vftprintf_p_l _vfprintf_p_l _vfwprintf_p_l
_vftprintf_s vfprintf_s vfwprintf_s
_vftprintf_s_l _vfprintf_s_l _vfwprintf_s_l
_vsctprintf _vscprintf _vscwprintf
_vsctprintf_l _vscprintf_l _vscwprintf_l
_vsctprintf_p _vscprintf_p _vscwprintf_p
_vsctprintf_p_l _vscprintf_p_l _vscwprintf_p_l
_vsntprintf _vsnprintf _vsnwprintf
_vsntprintf_l _vsnprintf_l _vsnwprintf_l
_vsntprintf_s _vsnprintf_s _vsnwprintf_s
_vsntprintf_s_l _vsnprintf_s_l _vsnwprintf_s_l
_vstprintf vsprintf _vswprintf
_vstprintf_l _vsprintf_l _vswprintf_l
_vstprintf_p _vsprintf_p _vswprintf_p
_vstprintf_p_l _vsprintf_p_l _vswprintf_p_l
_vstprintf_s vsprintf_s vswprintf_s
_vstprintf_s_l _vsprintf_s_l _vswprintf_s_l
_vtcprintf _vcprintf _vcwprintf
_vtcprintf_l _vcprintf_l _vcwprintf_l
_vtcprintf_p _vcprintf_p _vcwprintf_p
_vtcprintf_p_l _vcprintf_p_l _vcwprintf_p_l
_vtcprintf_s _vcprintf_s _vcwprintf_s
_vtcprintf_s_l _vcprintf_s_l _vcwprintf_s_l
_vtprintf vprintf vwprintf
_vtprintf_l _vprintf_l _vwprintf_l
_vtprintf_p _vprintf_p _vwprintf_p
_vtprintf_p_l _vprintf_p_l _vwprintf_p_l
_vtprintf_s vprintf_s vwprintf_s
_vtprintf_s_l _vprintf_s_l _vwprintf_s_l
vtprintf_s_l _vprintf_s_l _vwprintf_s_l

 

freestyler 發表在 痞客邦 留言(0) 人氣()