[轉載] EVC CString常用方法簡介

引用:http://www.wretch.cc/blog/bigdstut/13523891
CString::Compareint Compare( LPCTSTR lpsz ) const;
返回值 字串一樣 返回0
小於lpsz 返回-1
大於lpsz 返回1
區分大小字元
CString s1( "abc" );
CString s2( "abd" );
ASSERT( s1.Compare( s2 ) == -1 );
ASSERT( s1.Compare( "abe" ) == -1 );

CString::CompareNoCase
int CompareNoCase( LPCTSTR lpsz ) const;
返回值 字串一樣 返回0
小於lpsz 返回-1
大於lpsz 返回1
不區分大小字元

CString::Collate
int Collate( LPCTSTR lpsz ) const;
同CString::Compare

CString::CollateNoCase
int CollateNocase( LPCTSTR lpsz ) const;
同CString::CompareNoCase

CString::CString
CString( );
CString( const CString& stringSrc );
CString( TCHAR ch, int nRepeat = 1 );
CString( LPCTSTR lpch, int nLength );
CString( const unsigned char* psz );
CString( LPCWSTR lpsz );
CString( LPCSTR lpsz );
例子最容易說明問題
CString s1;
CString s2( "cat" );
CString s3 = s2;
CString s4( s2 + " " + s3 );
CString s5( 'x' ); // s5 = "x"
CString s6( 'x', 6 ); // s6 = "xxxxxx"
CString s7((LPCSTR)ID_FILE_NEW); // s7 = "Create a new document"
CString city = "Philadelphia";

CString::Delete
int Delete( int nIndex, int nCount = 1);
返回值是被刪除前的字串的長度
nIndex是第一個被刪除的字元,nCount是一次刪除幾個字元。根據我實驗得出的結果:當nCount>
刪除字串的最大長度(GetCount() - nIndex)時會出錯,當nCount過大,沒有足夠的字元刪除
,此函數不執行。
例子
CString str1,str2,str3;
char a;
str1 = "nihao";
str2 = "nIhao";
int x;
// int i=(str1 == str2);
str1.Delete(2,3);
如果nCount(3) > GetCount() – nIndex (5-2)就會執行錯誤

CString::Empty
Void Empty( );
沒有返回值 清空操作;
例子
CString s( "abc" );
s.Empty();
ASSERT( s.GetLength( ) == 0 );

CString::Find
int Find( TCHAR ch ) const;
int Find( LPCTSTR lpszSub ) const;
int Find( TCHAR ch, int nStart ) const;
int Find( LPCTSTR lpszSub, int nStart ) const;
返回值 不匹配的話返回 -1; 索引以0 開始
nStar 代表以索引值nStart 的字元開始搜索 ,
即為包含以索引nStart字元後的字串
例子
CString s( "abcdef" );
ASSERT( s.Find( 'c' ) == 2 );
ASSERT( s.Find( "de" ) == 3 );
Cstring str(“The stars are aligned”);
Ing n = str.Find('e',5);
ASSERT(n == 12)

CString::FindOneOf
int FindOneOf( LPCTSTR lpszCharSet ) const;
返回值 不匹配的話返回 -1; 索引以0 開始
注意::返回此字串中第一個在lpszCharSet中 也包括字元並且從零開始的索引值
例子
CString s( "abcdef" );
ASSERT( s.FindOneOf( "xd" ) == 3 ); // 'd' is first match.

CString::Format
void Format( LPCTSTR lpszFormat, ... );
void Format( UINT nFormatID, ... );
lpszFormat 一個格式控制字串
nFormatID 字串識別字
例子
CString str;
Str.Format(“%d”,13);
此時Str為13

CString::GetAt
TCHAR GetAt( int nIndex ) const;
返回標號為nIndex的字元,你可以把字串理解為一個陣列,GetAt類似於[].注意nIndex的範
,如果不合適會有調試錯誤。

CString::GetBuffer
LPTSTR GetBuffer( int nMinBufLength );
返回值
一個指向物件的(以空字元結尾的)字元緩衝區的LPTSTR 指標。
參數
nMinBufLength
字元緩衝區的以字元數表示的最小容量。這個值不包括一個結尾的空字元的空間。
說明
此成員函數返回一個指向CString 物件的內部字元緩衝區的指標。返回的LPTSTR 不是const,
此可以允許直接修改CString 的內容。如果你使用由GetBuffer 返回的指標來改變字串的內容,
必須在使用其他的CString 成員函數之前調用ReleaseBuffer 函數。
在調用ReleaseBuffer 之後,由GetBuffer 返回的位址也許就無效了,因為其他的CString 操
可能會導致CString 緩衝區被重新分配。如果你沒有改變此CString 的長度,則緩衝區不會被重
分配。當此CString 物件被銷毀時,其緩衝區記憶體將被自動釋放。
注意,如果你自己知道字串的長度,則你不應該添加結尾的空字元。但是,當你用ReleaseBuffer
釋放該緩衝區時,你必須指定最後的字串長度。如果你添加了結尾的空字元, 你應該給
eleaseBuffer 的長度參數傳遞-1 ,ReleaseBuffer 將對該緩衝區執行strlen 來確定它的長

下面的例子說明了如何用CString::GetBuffer。
// CString::GetBuffer 例子
CString s( "abcd" );
#ifdef _DEBUG
afxDump << "CString s " << p =" s.GetBuffer(" n =" str.Insert(" n ="="" n =" str.Insert(" n ="="" n =" str.Insert(555," n ="="" nnewlength =" -1" s = "abc" p =" s.GetBuffer(" n =" str.Remove(" n ="="" str ="="“This" n =" strZap.Replace('-'," n ="="" strzap ="="" n =" strBang.Replace(" n ="="1" n =" strBang.Replace" n ="="" n =" strBang.Replace(" n ="="" strbang ="="" s ="="" str = "\n\t a" str = "abbcadbabcadb ">

深 入C++Builder 探 訪 動 態 連 結 函 式 庫 (Dynamic Linking Libraries,DLLs)

http://www2.borland.com.tw/tw/td001018.html

[轉載] 如何將vc 的lib包成dll

一.此篇文章的目的為何??
示範如何由 VC 產生一個 Win32 Static Library 及一個 Win32 Dynamic Link Library,
並分別由 BCB 引用二.此篇文章的主題為何??
共分為四大部分,以下將分別針對這四大部分做介紹
===================================================================
1.利用 VC 產生一個 Win32 Static Library (LIB)
1.1.開啟 VC 選擇「File/New」開啟「New」Dialog
1.2.在左邊「Projects」Tab 中選擇「Win32 Static Library」
1.3.在右邊「Project name」欄位填好名稱 (例如: VCLib)
1.4.在右邊「Location」欄位選擇專案要存放的目錄
1.5.然後按「OK」Button,開啟「Win32 Static Library-Step 1 of 1」 Dialog,
確認「Pre-Compiled header」及「MFC support」不要打勾
1.6.然後按「Finish」Button
1.7.在 VC 的 IDE 環境之中,你會發現這個 LIB 專案還是空的,
因此我們要先為這個專案新增 *.h 及 *.cpp
1.8.選擇「File/New」開啟「New」Dialog
1.9.在左邊「Files」Tab 中選擇「C/C++ Header File」
1.10.在右邊確認「Add to project」有打勾,並在「File」欄位輸入檔案名稱 (例如: VCLib.h),
最後按「OK」Button
1.11.在 VC 的 IDE 環境之中,你會發現這個 LIB 專案已經新增了一個檔案 VCLib.h
(在左邊的「FileView」Tab 中的樹狀結構中的「Header Files」
子目錄裡面可以看得到)
1.12.選擇「File/New」開啟「New」Dialog
1.13.在左邊「Files」Tab 中選擇「C++ Source File」
1.14.在右邊確認「Add to project」有打勾,並在「File」欄位輸入檔案名稱
(例如: VCLib.cpp), 最後按「OK」Button
1.15.在 VC 的 IDE 環境之中,你會發現這個 LIB 專案已經新增了一個檔案 VCLib.cpp
(在左邊的「FileView」Tab 中的樹狀結構中的「Source Files」
子目錄裡面可以看得到)
1.16.接著在 VCLib.h 檔案裡面加入以下的程式碼
#ifndef __VCLIB_H__
#define __VCLIB_H__
int AddMethod(int a, int b);
#endif // __VCLIB_H__
1.17.接著在 VCLib.cpp 檔案裡面加入以下的程式碼
#include "VCLib.h"
int AddMethod(int a, int b)
{
return(a+b);
}
1.18.選擇「Build/Rebuild All」就會開始編譯此 LIB 專案直至完成
1.19.若編譯無誤的話,用檔案總管檢視你儲存的專案目錄下,有可能會產生一個「Debug」
子目錄,也有可能產生一個「Release」子目錄,這跟此 LIB 專案的設定有關
(可從「Project/Settings」中去設定要編譯成「Debug」或「Release」版本,
預設值為「Debug」),在此建議先編譯成「Release」版本,
因此會在「Release」子目錄下找到這個 LIB 專案主要的成品檔案「VCLib.lib」
1.20.選擇「File/Close Workspace」關閉此 LIB 專案
====================================================================
2.利用 VC 及 1. 中的 LIB 產生一個 Win32 Dynamic Link Library (DLL)
2.1.開啟 VC 選擇「File/New」開啟「New」Dialog
2.2.在左邊「Projects」Tab 中選擇「Win32 Dynamic-Link Library」
2.3.在右邊「Project name」欄位填好名稱 (例如: VCDll)
2.4.在右邊「Location」欄位選擇專案要存放的目錄
2.5.然後按「OK」Button,開啟「Win32 Dynamic-Lin Library - Step 1 of 1」Dialog,
選擇「A DLL that exports some symbols」(選擇這個的原因,是因為可以偷懶)
2.6.然後按「Finish」Button
2.7.在 VC 的 IDE 環境之中,你會發現這個 DLL 專案已經自動新增了五個檔案
stdAfx.cpp, VCDll.cpp, stdAfx.h, VCDll.h, ReadMe.txt(在左邊的「FileView」
Tab 中的樹狀結構中的「Source Files」及「Header Files」子目錄裡面可以看得到)
2.8.在 VC 的 IDE 環境之中,在左邊的「FileView」
Tab 中選擇「VCDll files」按滑鼠右鍵,
選擇「Add Files to Project」開啟「Insert Files into Project」Dialog,
選擇「檔案類型」為「Library Files (.lib)」,
「檔案名稱」選擇剛剛 1. 中的成品「VCLib.lib」
2.9.如果加入成功的話,在 VC 的 IDE 環境之中,左邊的「FileView」
樹狀結構中可以看得到剛剛加入的檔案「VCLib.lib」
2.10.更改檔案 VCDll.h 的內容如下
#ifndef __VCDLL_H__
#define __VCDLL_H__
#define VCDLL_API __declspec(dllexport)
extern "C" {
VCDLL_API int AddMethodEx(int a, int b);
}
#endif // __VCDLL_H__
2.11.更改檔案 VCDll.cpp 的內容如下
#include "stdafx.h"
#include "VCDll.h"
#include "..\VCLib\VCLib.h"
BOOL APIENTRY DllMain(HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved)
{
switch(ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
int AddMethodEx(int a, int b)
{
return(AddMethod(a, b));
}
2.12.選擇「Build/Rebuild All」就會開始編譯此 DLL 專案直至完成
2.13.若編譯無誤的話,用檔案總管檢視你儲存的專案目錄下,
有可能會產生一個「Debug」子目錄,也有可能產生一個「Release」子目錄,
這跟此 DLL 專案的設定有關 (可從「Project/Settings」中
去設定要編譯成「Debug」或「Release」版本,預設值為「Debug」),
在此建議先編譯成「Release」版本,因此會在「Release」子目錄下找到
這個 DLL 專案主要的成品檔案「VCDll.dll」
2.14.選擇「File/Close Workspace」關閉此 DLL 專案
3.利用 BCB 引用 2. 中的 DLL (靜態連結)
3.1.開啟 BCB 並新增一個 Application 專案
3.2.選擇「File/Save Project As」將此專案更名為「BCBSta」,
並將檔案儲存到自定的目錄之下
3.3.將 VCDll.dll 及 VCDll.h 兩個檔案,複製到 BCBSta 專案的目錄下,
並另外開啟一個 DOS BOX (Command Line),在 BCBSta 專案的目錄 下鍵入指令
「implib -a VCDll.lib VCDll.dll」,如果成功的話,
會在 BCBSta 目錄下產生一個新的檔案「VCDll.lib」
3.4.在 BCB 的 IDE 中選擇「View/Project Manager」開啟「Project Manager」Dialog,
把剛剛產生的檔案「VCDll.lib」加入此 BCBSta 專案
3.5.在 Form1 上拉一個 Button1,然後在 Unit1.cpp 中加入以下的程式碼
#include "VCDll.h"
void __fastcall TForm1::Button1Click(TObject *Sender)
{
ShowMessage(IntToStr(AddMethodEx(1, 1)));
}
3.6.執行 BCBSta 專案看看是否成功??
3.7.關閉 BCB
4.利用 BCB 引用 2. 中的 DLL (動態連結)
4.1.開啟 BCB 並新增一個 Application 專案
4.2.選擇「File/Save Project As」將此專案更名為「BCBDyn」,
並將檔 安儲存到自定的目錄之下
4.3.將 VCDll.dll 檔案複製到 BCBDyn 專案的目錄下
4.4.在 Form1 上拉一個 Button1,然後在 Unit1.cpp 中加入以下的程式碼
typedef int (*ADDMETHODEX)(int, int);
void __fastcall TForm1::Button1Click(TObject *Sender)
{
HINSTANCE dll=NULL;
ADDMETHODEX AddMethodEx=NULL;
dll=LoadLibrary("VCDll.dll");
if(dll!=NULL)
{
AddMethodEx=(ADDMETHODEX)GetProcAddress(dll, "AddMethodEx");
if(AddMethodEx!=NULL)
{
ShowMessage(IntToStr(AddMethodEx(1, 1)));
}
FreeLibrary(dll);
}
}
4.5.執行 BCBDyn 專案看看是否成功??
4.6.關閉 BCB三.有完整的範例程式碼可以下載嗎??
http://delphi.ktop.com.tw/loadfile.php?TOPICID=10460160&CC=233940
四.範例程式該如何使用呢?? 下載並解壓縮檔案 VCBCB1.zip 以後,會產生 VCBCB1 目錄,
在此目錄之下又有四個子目錄,
這四個子目錄分別對應到
二. 中所敘述的四個部分五.如果寫得不好,或是有不對的地方,請大家多多指教

[轉載] *.LIB 兩種涵義

    1. 第一種是 Win32 Static Library,這種檔案的格式在 VC 與 BCB 是不相同的,而且用 coff2omf 這個工具也無法正確互轉格式,目前也 還沒有看過能夠正確轉換的工具 (因為無法分別清楚得知 VC/BCB 的 Win32 Static Library 內部的詳細資料結構);你所說的那個檔案 (comsupp.lib)
    2. 另外一種通常是專案型態為 Win32 Dynamic-Link Library 的副屬產出物, 例如: 假設你有一個 DLL 的專案名稱叫做 ABC 的話,在編譯、連結完成之 後,除了可以產生 ABC.dll 之外,也會產生 ABC.lib。當 ABC.dll 要給別 人使用的時候,就要把 ABC.dll/ABC.lib/ABC.h 至少這三個檔案提供給對方 ,這樣子對方就可以選擇靜態連結 (會同時用到 ABC.dll/ABC.lib/ABC.h 這 三個檔案) 或動態連結 (只會用到 ABC.dll/ABC.h 這兩個檔案) 來呼叫你的 ABC.dll 內部的 function

我與HonHon之旅二: 南方澳&頭城之旅

第一次開著我的Honda CV8 到南方澳吃海產 , 真是棒極了 ,
~非常感謝JOE的帶路唷 ~

這間是我ㄇ去吃的海產店唷(富美活海鮮)~還不錯吃唷




以下是我ㄇ去吃的菜色~~~

重點是白蝦真是他媽的好吃ㄚ~~~值得推薦






南方澳有名的南天宮唷~~~


金媽祖附駕



玉媽祖


金媽祖

頭城阿宗芋冰城~~推薦在推薦唷



Terry


Joe

[轉載] DeviceIoControl

DeviceIoControl 的MSDN reference
以 WAVEDEV 為例IO Control Code 定義在 PUBLIC\COMMON\OAK\INC\WAVEDEV.H 中
這個 header file 的 comment 中有說明 audio driver 的複雜架構。
WAVDEV 處理的IO Control Cmd 有
IOCTL_MIX_MESSAGE
IOCTL_WAV_MESSAGE
都定義在這裡,這兩個 command code 都屬於 FILE_DEVICE_SOUND (分別是 3, 115)。
device io control 又把parameter 作進一步擴充,
把argument 再定義為 message (PMMDRV_MESSAGE_PARMS):

typedef struct {
UINT uDeviceId;
UINT uMsg;
DWORD dwUser;
DWORD dwParam1;
DWORD dwParam2;
} MMDRV_MESSAGE_PARAMS;
所以.. WAVEDEV 的IO Control handler 再依照 uMsg 細分 command。
使用時,要先CreateFile("drivername"..),
"drivername"就是那個 3 char + 1 index.
取得的handle 傳入 DevIoControl ( )作第一個argument,
prototype:
BOOL DeviceIoControl( HANDLE hDevice,
DWORD dwIoControlCode,
LPVOID lpInBuffer,
DWORD nInBufferSize,
LPVOID lpOutBuffer,
DWORD nOutBufferSize,
LPDWORD lpBytesReturned,
LPOVERLAPPED lpOverlapped);
和 KernelIoControl( )比起來,除了一開始的 hDevice外,
就是最後的 Overlapped. - 這個固定要用 NULL。

How to build bluetooth driver for wince 5.0 (CSR)

Step1 : 在 "\Platform\專案名稱\Files\Platform.reg 加入以下敘述
;Setting ANW / CSR Bluetooth; @CESYSGEN IF BTD_CSR
[HKEY_LOCAL_MACHINE\Software\Microsoft\Bluetooth\HCI]
"flags"=dword:1 "name"="COM1:" "baud"=dword:1c200
[HKEY_LOCAL_MACHINE\Software\Microsoft\Bluetooth\sys]

"COD"=dword:200408
[HKEY_LOCAL_MACHINE\ExtModems\Bluetooth_dun]

"port"="COM8:"
"DeviceType"=dword:1
"FriendlyName"="Bluetooth DUN on COM8"
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\Serial1]
"DeviceArrayIndex"=dword:0
"Irq"=dword:1c
"MemBase"=dword:50000000 ; 設定 2440 Uart0 Memory Address
"MemLen"=dword:2C
"InterruptBitsShift"=dword:0 ; UART 0 Interrupt Sub Register shift bit.
"ISTTimeouts"=dword:200 ; every 512 ticks checking Modem status.

"Prefix"="COM"
"Index"=dword:1
"Dll"="serial_smdk2440.dll"
"Order"=dword:0
"Priority"=dword:0
"Port"="COM1:"
"DeviceType"=dword:0
"FriendlyName"=LOC_DISPLAYNAME_COM1
"Tsp"="unimodem.dll"
"IClass"="{CC5195AC-BA49-48a0-BE17-DF6D1B0173DD}"
"DevConfig"=hex: 10,00, 00,00, 05,00,00,00, 10,01,00,00, 00,4B,00,00, 00,00, 08, 00, 00, 00,00,00,00
"opened"=dword:0
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
Step2 : 加入Profile組件(Catalog)
Bluetooth DUN Gateway
BlueHS/HF and Audio Gateway Service
Bluetooth LAP and Configuration Utility
Bluetooth PAN
Bluetooth Stack with Integrated CSR Chipset Driver
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
Step3 : Set C:\WINCE500\PBWorkspaces\Focus_B01_64x64\
WINCE500\Focus_B01_64x64_ARMV4I\OAK\MISC

if /i not "%1"=="pass3" goto :Not_Pass3
set CE_MODULES=%CE_MODULES% bthcsr
goto :EOF
:Not_Pass3
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
Step4 : copy files to release folder & makeimg

虹光大成就-密教灌頂(一)