青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

大龍的博客

常用鏈接

統(tǒng)計(jì)

最新評(píng)論

vc數(shù)據(jù)類型轉(zhuǎn)換大全

int i = 100;
long l = 2001;
float f=300.2;
double d=12345.119;
char username[]="程佩君";
char temp[200];
char *buf;
CString str;
_variant_t v1;
_bstr_t v2;

一、其它數(shù)據(jù)類型轉(zhuǎn)換為字符串


短整型(int)
itoa(i,temp,10);///將i轉(zhuǎn)換為字符串放入temp中,最后一個(gè)數(shù)字表示十進(jìn)制
itoa(i,temp,2); ///按二進(jìn)制方式轉(zhuǎn)換
長(zhǎng)整型(long)
ltoa(l,temp,10);
浮點(diǎn)數(shù)(float,double)
用fcvt可以完成轉(zhuǎn)換,這是MSDN中的例子:
int decimal, sign;
char *buffer;
double source = 3.1415926535;
buffer = _fcvt( source, 7, &decimal, &sign );
運(yùn)行結(jié)果:source: 3.1415926535 buffer: '31415927' decimal: 1 sign: 0
decimal表示小數(shù)點(diǎn)的位置,sign表示符號(hào):0為正數(shù),1為負(fù)數(shù)
CString變量
str = "2008北京奧運(yùn)";
buf = (LPSTR)(LPCTSTR)str;
BSTR變量
BSTR bstrValue = ::SysAllocString(L"程序員");
char * buf = _com_util::ConvertBSTRToString(bstrValue);
SysFreeString(bstrValue);
AfxMessageBox(buf);
delete(buf);
CComBSTR變量
CComBSTR bstrVar("test");
char *buf = _com_util::ConvertBSTRToString(bstrVar.m_str);
AfxMessageBox(buf);
delete(buf);

_bstr_t變量
_bstr_t類型是對(duì)BSTR的封裝,因?yàn)橐呀?jīng)重載了=操作符,所以很容易使用
_bstr_t bstrVar("test");
const char *buf = bstrVar;///不要修改buf中的內(nèi)容
AfxMessageBox(buf);


通用方法(針對(duì)非COM數(shù)據(jù)類型)
用sprintf完成轉(zhuǎn)換

char? buffer[200];
char? c = '1';
int?? i = 35;
long? j = 1000;
float f = 1.7320534f;
sprintf( buffer, "%c",c);
sprintf( buffer, "%d",i);
sprintf( buffer, "%d",j);
sprintf( buffer, "%f",f);

二、字符串轉(zhuǎn)換為其它數(shù)據(jù)類型
strcpy(temp,"123");

短整型(int)
i = atoi(temp);
長(zhǎng)整型(long)
l = atol(temp);
浮點(diǎn)(double)
d = atof(temp);
CString變量
CString name = temp;
BSTR變量
BSTR bstrValue = ::SysAllocString(L"程序員");
...///完成對(duì)bstrValue的使用
SysFreeString(bstrValue);

CComBSTR變量
CComBSTR類型變量可以直接賦值
CComBSTR bstrVar1("test");
CComBSTR bstrVar2(temp);

_bstr_t變量
_bstr_t類型的變量可以直接賦值
_bstr_t bstrVar1("test");
_bstr_t bstrVar2(temp);


三、其它數(shù)據(jù)類型轉(zhuǎn)換到CString
使用CString的成員函數(shù)Format來(lái)轉(zhuǎn)換,例如:


整數(shù)(int)
str.Format("%d",i);
浮點(diǎn)數(shù)(float)
str.Format("%f",i);
字符串指針(char *)等已經(jīng)被CString構(gòu)造函數(shù)支持的數(shù)據(jù)類型可以直接賦值
str = username;
對(duì)于Format所不支持的數(shù)據(jù)類型,可以通過(guò)上面所說(shuō)的關(guān)于其它數(shù)據(jù)類型轉(zhuǎn)化到char *的方法先轉(zhuǎn)到char *,然后賦值給CString變量。

四、BSTR、_bstr_t與CComBSTR


CComBSTR 是ATL對(duì)BSTR的封裝,_bstr_t是C++對(duì)BSTR的封裝,BSTR是32位指針,但并不直接指向字串的緩沖區(qū)。
char *轉(zhuǎn)換到BSTR可以這樣:
BSTR b=_com_util::ConvertStringToBSTR("數(shù)據(jù)");///使用前需要加上comutil.h和comsupp.lib
SysFreeString(bstrValue);
反之可以使用
char *p=_com_util::ConvertBSTRToString(b);
delete p;
具體可以參考一,二段落里的具體說(shuō)明。

CComBSTR與_bstr_t對(duì)大量的操作符進(jìn)行了重載,可以直接進(jìn)行=,!=,==等操作,所以使用非常方便。
特別是_bstr_t,建議大家使用它。

五、VARIANT 、_variant_t 與 COleVariant


VARIANT的結(jié)構(gòu)可以參考頭文件VC98\Include\OAIDL.H中關(guān)于結(jié)構(gòu)體tagVARIANT的定義。
對(duì)于VARIANT變量的賦值:首先給vt成員賦值,指明數(shù)據(jù)類型,再對(duì)聯(lián)合結(jié)構(gòu)中相同數(shù)據(jù)類型的變量賦值,舉個(gè)例子:
VARIANT va;
int a=2001;
va.vt=VT_I4;///指明整型數(shù)據(jù)
va.lVal=a; ///賦值

對(duì)于不馬上賦值的VARIANT,最好先用Void VariantInit(VARIANTARG FAR* pvarg);進(jìn)行初始化,其本質(zhì)是將vt設(shè)置為VT_EMPTY,下表我們列舉vt與常用數(shù)據(jù)的對(duì)應(yīng)關(guān)系:

Byte bVal;? // VT_UI1.
Short iVal;? // VT_I2.
long lVal;? // VT_I4.
float fltVal;? // VT_R4.
double dblVal;? // VT_R8.
VARIANT_BOOL boolVal;? // VT_BOOL.
SCODE scode;? // VT_ERROR.
CY cyVal;? // VT_CY.
DATE date;? // VT_DATE.
BSTR bstrVal;? // VT_BSTR.
DECIMAL FAR* pdecVal? // VT_BYREF|VT_DECIMAL.
IUnknown FAR* punkVal;? // VT_UNKNOWN.
IDispatch FAR* pdispVal;? // VT_DISPATCH.
SAFEARRAY FAR* parray;? // VT_ARRAY|*.
Byte FAR* pbVal;? // VT_BYREF|VT_UI1.
short FAR* piVal;? // VT_BYREF|VT_I2.
long FAR* plVal;? // VT_BYREF|VT_I4.
float FAR* pfltVal;? // VT_BYREF|VT_R4.
double FAR* pdblVal;? // VT_BYREF|VT_R8.
VARIANT_BOOL FAR* pboolVal;? // VT_BYREF|VT_BOOL.
SCODE FAR* pscode;? // VT_BYREF|VT_ERROR.
CY FAR* pcyVal;? // VT_BYREF|VT_CY.
DATE FAR* pdate;? // VT_BYREF|VT_DATE.
BSTR FAR* pbstrVal;? // VT_BYREF|VT_BSTR.
IUnknown FAR* FAR* ppunkVal;? // VT_BYREF|VT_UNKNOWN.
IDispatch FAR* FAR* ppdispVal;? // VT_BYREF|VT_DISPATCH.
SAFEARRAY FAR* FAR* pparray;? // VT_ARRAY|*.
VARIANT FAR* pvarVal;? // VT_BYREF|VT_VARIANT.
void FAR* byref;? // Generic ByRef.
char cVal;? // VT_I1.
unsigned short uiVal;? // VT_UI2.
unsigned long ulVal;? // VT_UI4.
int intVal;? // VT_INT.
unsigned int uintVal;? // VT_UINT.
char FAR * pcVal;? // VT_BYREF|VT_I1.
unsigned short FAR * puiVal;? // VT_BYREF|VT_UI2.
unsigned long FAR * pulVal;? // VT_BYREF|VT_UI4.
int FAR * pintVal;? // VT_BYREF|VT_INT.
unsigned int FAR * puintVal;? //VT_BYREF|VT_UINT.


_variant_t是VARIANT的封裝類,其賦值可以使用強(qiáng)制類型轉(zhuǎn)換,其構(gòu)造函數(shù)會(huì)自動(dòng)處理這些數(shù)據(jù)類型。
使用時(shí)需加上#include <comdef.h>
例如:
long l=222;
ing i=100;
_variant_t lVal(l);
lVal = (long)i;


COleVariant的使用與_variant_t的方法基本一樣,請(qǐng)參考如下例子:
COleVariant v3 = "字符串", v4 = (long)1999;
CString str =(BSTR)v3.pbstrVal;
long i = v4.lVal;


六、其它一些COM數(shù)據(jù)類型

根據(jù)ProgID得到CLSID
HRESULT CLSIDFromProgID( LPCOLESTR lpszProgID,LPCLSID pclsid);
CLSID clsid;
CLSIDFromProgID( L"MAPI.Folder",&clsid);

根據(jù)CLSID得到ProgID
WINOLEAPI ProgIDFromCLSID( REFCLSID clsid,LPOLESTR * lplpszProgID);
例如我們已經(jīng)定義了 CLSID_IApplication,下面的代碼得到ProgID
LPOLESTR pProgID = 0;
ProgIDFromCLSID( CLSID_IApplication,&pProgID);
...///可以使用pProgID
CoTaskMemFree(pProgID);//不要忘記釋放

七、ANSI與Unicode
Unicode稱為寬字符型字串,COM里使用的都是Unicode字符串。

將ANSI轉(zhuǎn)換到Unicode
(1)通過(guò)L這個(gè)宏來(lái)實(shí)現(xiàn),例如: CLSIDFromProgID( L"MAPI.Folder",&clsid);
(2)通過(guò)MultiByteToWideChar函數(shù)實(shí)現(xiàn)轉(zhuǎn)換,例如:
char *szProgID = "MAPI.Folder";
WCHAR szWideProgID[128];
CLSID clsid;
long lLen = MultiByteToWideChar(CP_ACP,0,szProgID,strlen(szProgID),szWideProgID,sizeof(szWideProgID));
szWideProgID[lLen] = '\0';
(3)通過(guò)A2W宏來(lái)實(shí)現(xiàn),例如:
USES_CONVERSION;
CLSIDFromProgID( A2W(szProgID),&clsid);
將Unicode轉(zhuǎn)換到ANSI
(1)使用WideCharToMultiByte,例如:
// 假設(shè)已經(jīng)有了一個(gè)Unicode 串 wszSomeString...
char szANSIString [MAX_PATH];
WideCharToMultiByte ( CP_ACP, WC_COMPOSITECHECK, wszSomeString, -1, szANSIString, sizeof(szANSIString), NULL, NULL );
(2)使用W2A宏來(lái)實(shí)現(xiàn),例如:
USES_CONVERSION;
pTemp=W2A(wszSomeString);
八、其它

對(duì)消息的處理中我們經(jīng)常需要將WPARAM或LPARAM等32位數(shù)據(jù)(DWORD)分解成兩個(gè)16位數(shù)據(jù)(WORD),例如:
LPARAM lParam;
WORD loValue = LOWORD(lParam);///取低16位
WORD hiValue = HIWORD(lParam);///取高16位


對(duì)于16位的數(shù)據(jù)(WORD)我們可以用同樣的方法分解成高低兩個(gè)8位數(shù)據(jù)(BYTE),例如:
WORD wValue;
BYTE loValue = LOBYTE(wValue);///取低8位
BYTE hiValue = HIBYTE(wValue);///取高8位


兩個(gè)16位數(shù)據(jù)(WORD)合成32位數(shù)據(jù)(DWORD,LRESULT,LPARAM,或WPARAM)
LONG MAKELONG( WORD wLow, WORD wHigh );
WPARAM MAKEWPARAM( WORD wLow, WORD wHigh );
LPARAM MAKELPARAM( WORD wLow, WORD wHigh );
LRESULT MAKELRESULT( WORD wLow, WORD wHigh );


兩個(gè)8位的數(shù)據(jù)(BYTE)合成16位的數(shù)據(jù)(WORD)
WORD MAKEWORD( BYTE bLow, BYTE bHigh );


從R(red),G(green),B(blue)三色得到COLORREF類型的顏色值
COLORREF RGB( BYTE byRed,BYTE byGreen,BYTE byBlue );
例如COLORREF bkcolor = RGB(0x22,0x98,0x34);


從COLORREF類型的顏色值得到RGB三個(gè)顏色值
BYTE Red = GetRValue(bkcolor); ///得到紅顏色
BYTE Green = GetGValue(bkcolor); ///得到綠顏色
BYTE Blue = GetBValue(bkcolor); ///得到蘭顏色

九、注意事項(xiàng)
假如需要使用到ConvertBSTRToString此類函數(shù),需要加上頭文件comutil.h,并在setting中加入comsupp.lib或者直接加上#pragma comment( lib, "comsupp.lib" )

后記:本文匆匆寫(xiě)成,錯(cuò)誤之處在所難免,歡迎指正.


關(guān)于把BSTR類型數(shù)據(jù)轉(zhuǎn)換成CString 類型數(shù)據(jù)時(shí)的問(wèn)題?
當(dāng)我在把BSTR類型數(shù)據(jù)轉(zhuǎn)換成CString 或 “char* 類型”數(shù)據(jù)時(shí),發(fā)現(xiàn)在BSTR類型字符串較短的情況下沒(méi)問(wèn)題,當(dāng)較長(zhǎng)時(shí)就會(huì)出現(xiàn)
內(nèi)存讀寫(xiě)錯(cuò)了。(在NT,2000下都測(cè)試是這樣的。)
根據(jù)你所說(shuō):
1)字符串指針(char *)等已經(jīng)被CString構(gòu)造函數(shù)支持的數(shù)據(jù)類型 可以直接賦值 str = username;
2)當(dāng)b 為BSTR類型時(shí)可以使用
char *p=_com_util::ConvertBSTRToString(b);
于是以下是對(duì)的:
CString cstr;
BSTR bstr;
....
cstr=com_util::ConvertBSTRToString(bstr);
...
可是當(dāng)bstr非常大時(shí)(其實(shí),較大時(shí)就會(huì))就會(huì)出現(xiàn)內(nèi)存讀寫(xiě)錯(cuò),不知何故。
此外我發(fā)現(xiàn)cstr=com_util::ConvertBSTRToString(bstr);
可以簡(jiǎn)化為 cstr=bstr; 但當(dāng)bstr較大時(shí)同樣出現(xiàn)這個(gè)問(wèn)題。
請(qǐng)兄弟幫忙!急。謝謝!

如何轉(zhuǎn)化((list*)fileip.bian)->liang

關(guān)于把CString轉(zhuǎn)化成LPCTSTR的問(wèn)題 作者:jakiesun 發(fā)表日期:2001-9-5 20:08:48
我記的我以前寫(xiě)過(guò)這樣一段代碼
void function()
{
CString str,str1,str2;
function((char*)(LPCTSTR)str1);
str=str1;
...//調(diào)試道此發(fā)現(xiàn)str2的值隨著str的改變而改變,請(qǐng)問(wèn)能解釋一下為什么,如有回答,請(qǐng)通知
wangshaohong@sohu.com,tx

}

添加lib支持 作者:磨刀霍霍 發(fā)表日期:2001-9-10 11:32:12
如果不添加會(huì)產(chǎn)生錯(cuò)誤,在setting中加入comsupp.lib或者直接#pragma comment( lib, "comsupp.lib" )
微軟認(rèn)為缺省的設(shè)置call convention如果不設(shè)置成__cdecl也會(huì)出現(xiàn)同樣的錯(cuò)誤。


1。int 轉(zhuǎn)成cstring ??

回復(fù)人: caigzhi(caigzhi) (2001-10-17 11:27:35) 得0分
CString 的成員函數(shù)Format()

int a = 2131;
CString str;
str.Format("%d",a);

回復(fù)人: tenchi(C與C++之間) (2001-10-17 11:32:12) 得0分
int i=2001;
char str[10];
_itoa(i,str,10);
CString szString=str;
回復(fù)人: fiolin(幽深的水) (2001-10-17 11:45:40) 得0分
他們兩個(gè)的都可以!!

回復(fù)人: sohucsdnvc(thanks) (2001-10-17 13:24:17) 得0分
那如何把double轉(zhuǎn)成cstring
回復(fù)人: yihugang(小虎子) (2001-10-17 13:29:15) 得6分
int i = 2131;
char *c=new char[20];
CString str;
sprintf(c,'%d',i);
str=*c;


回復(fù)人: Gu_c_h(Gu) (2001-10-17 14:07:17) 得0分
用 _gcvt 下面是 msdn 的例子

Example

/* _GCVT.C: This program converts -3.1415e5
* to its string representation.
*/

#include <stdlib.h>
#include <stdio.h>

void main( void )
{
char buffer[50];
double source = -3.1415e5;
_gcvt( source, 7, buffer );
printf( "source: %f buffer: '%s'\n", source, buffer );
_gcvt( source, 7, buffer );
printf( "source: %e buffer: '%s'\n", source, buffer );
}


Output

source: -314150.000000 buffer: '-314150.'
source: -3.141500e+005 buffer: '-314150.'

回復(fù)人: Gu_c_h(Gu) (2001-10-17 14:49:56) 得6分
int a = -3.1415e5;
CString str;
str.Format("%f",a);
回復(fù)人: ruixp(銳劍) (2001-10-17 15:06:48) 得6分
CString 的成員函數(shù)Format()
int a = 2131;
CString str;
str.Format("%d",a);

2。基類對(duì)象怎么能轉(zhuǎn)換成派生類對(duì)象?
int CDaoListView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
lpCreateStruct->style |= LVS_REPORT |LVS_EDITLABELS;
if (CListView::OnCreate(lpCreateStruct) == -1)
return -1;

//////////// 創(chuàng)建ImageList;
CDaoViewApp * pApp = (CDaoViewApp *) AfxGetApp();

m_pImageList = new CImageList();
ASSERT(m_pImageList !=NULL);
m_pImageList->Create(16,16,TRUE,4,4);
m_pImageList->Add(pApp->LoadIcon(IDI_KEY));
m_pImageList->Add(pApp->LoadIcon(IDI_ICON4));
m_pImageList->Add(pApp->LoadIcon(IDI_ICON5));

CListCtrlEx& ctlList = (CListCtrlEx&) GetListCtrl();//我不懂的就這句,cListCtrlEx看下面的聲明。
ctlList.SetImageList (m_pImageList, LVSIL_SMALL) ;
////////////
return 0;
}

class CListCtrlEx : public CListCtrl//類cListCtrlEx定義。
{.....
}
class CDaoListView : public CListView//cDaoListView定義!
{
...
}
注:我的問(wèn)題是GetListCtrl()返回的是一個(gè)cListCtrl對(duì)象的引用,怎么能把它轉(zhuǎn)換成一個(gè)它的派生類對(duì)象的引用?c++的類型轉(zhuǎn)換怎么支持?


回復(fù)貼子:
回復(fù)人: lhj(努力加油) (2002-1-29 18:56:06) 得0分
CListCtrlEx& ctlList = (CListCtrlEx&) GetListCtrl();
這是強(qiáng)制類型轉(zhuǎn)換,&表示是一個(gè)引用,lctList的值在這次賦值后不能被修改。

回復(fù)人: wwwsq(wwwsq) (2002-1-29 19:09:22) 得0分
建議你找本C++方面的書(shū)看看,VC雖然號(hào)稱可視,實(shí)際上C++基礎(chǔ)還是很重要的。


回復(fù)人: xcopy(xcopy) (2002-1-29 19:26:16) 得0分
用dynamic_cast()可以安全的轉(zhuǎn)換。

3。如何在CString和double之間轉(zhuǎn)換?要求轉(zhuǎn)換之后能保留小數(shù)點(diǎn),保留正負(fù)號(hào)??

cstring::format(%.xe) x為精度位

回復(fù)人: pchaos(雜講) (2002-1-28 11:21:46) 得0分
CString str;
double db;
str = "123.456";
db = atof((LPCTSTR)str);
回復(fù)人: hgw111(hg) (2002-1-28 11:52:57) 得0分
CString -> double : atof
double ->CString :Format
回復(fù)人: pchaos(雜講) (2002-1-28 13:46:04) 得0分
CString str;
double db;
str = "123.456";
db = atof((LPCTSTR)str);
db = 777.999;
str.format("%e", db);

4。字符型要轉(zhuǎn)換成int??
atoi(str)

5。_bstr_t 到 unsigned int??
_bstr_t str;
unsigned int Length=6;
Length=Length-str.length();

6。VARIANT類型轉(zhuǎn)換問(wèn)題?
我在使用MSCOMM中SetOutput()函數(shù)時(shí)
形參必須為VARIANT變量
如何將其它的數(shù)據(jù)類型轉(zhuǎn)換為VARIANT類型?
如:Cstring->VARIANT、 *char->VARIANT
我對(duì)VARIANT的類型結(jié)構(gòu)體不太熟,請(qǐng)講詳細(xì)些(最好有范例),謝謝!

回復(fù)貼子:
回復(fù)人: vc_xiaoxin(小新) (2001-12-26 15:43:57) 得0分
VARIANT本身是一個(gè)復(fù)雜的結(jié)構(gòu),別的數(shù)據(jù)怎么轉(zhuǎn)呀?關(guān)注
回復(fù)人: mpg_liu(星仁) (2001-12-27 18:33:50) 得10分
定義一個(gè)VARIANT變量后,他應(yīng)該是一個(gè)結(jié)構(gòu)體變量,其中有一個(gè)成員是字符型的,給這個(gè)成員賦值
回復(fù)人: LLnju(LLnju) (2001-12-27 18:36:10) 得0分
實(shí)在不清楚嘛就用 _variant_t , COleVariant 這些東東嘛,很好用的啊
回復(fù)人: softarts(CDMA2000) (2001-12-27 18:41:32) 得10分
構(gòu)造一個(gè)就行了。
VARIANT varXX;
CString strYY;
varXX.vt=VT_BSTR;
varXX.bstrVal = strYY.allocsysstring();
應(yīng)該可以了。
回復(fù)人: softarts(CDMA2000) (2001-12-27 18:42:11) 得0分
我也覺(jué)得COleVariant要好用一些,呵呵,我都用它。
回復(fù)人: bobofu(有問(wèn)題要問(wèn)) (2001-12-27 19:32:18) 得10分
CString str;
_variant_t var;
var = _variant_t(str);

7。COleVarant 如何轉(zhuǎn)換為 CString?
CString 如何轉(zhuǎn)換為 char *
CString 如何轉(zhuǎn)換為 char[xx] ??

CString 如何轉(zhuǎn)換為 char * wsprintf或者=
CString 如何轉(zhuǎn)換為 char[xx] strcpy()
回復(fù)人: SecretGarden(天堂鳥(niǎo)) (2002-1-14 11:55:23) 得0分
COleVarant封裝了VAREANT類型。
VAREANT類型其實(shí)是個(gè)巨大地Union,里面自然有你
想要地unsigned char *類型。
CString地GetBuffer和Format可以實(shí)現(xiàn)你的后兩個(gè)問(wèn)題


8。v_variant_t類型轉(zhuǎn)換成cstring
總提示我cstring未定義
程序如下
_variant_t vfirstname;//存儲(chǔ)的是數(shù)據(jù)庫(kù)中的數(shù)據(jù)
CString str;//提示出錯(cuò)
vfirstname=pRs->GetCollect (_variant_t("Phone_Num"));
vfirstname.ChangeType (VT_BSTR);
str=vfirstname.bstrVal;//提示出錯(cuò)


回復(fù)貼子:
回復(fù)人: hydnoahark(諾亞方舟) (2001-11-12 11:56:51) 得10分
>>CString str;//提示出錯(cuò)
要求include <afx.h>并且設(shè)置Use run-time Library為Multithreaded
回復(fù)人: zhengyun_ustc(^-^) (2001-11-12 12:04:39) 得15分
CString未定義,說(shuō)明你的工程沒(méi)有引用MFC!!

要想使你的工程支持MFC,請(qǐng)按照以下步驟作:
1:在你的stdafx.h的頭文件中加入:
#include "afxtempl.h"
這是一個(gè)囊括了MFC的集合定義的頭文件,有了它,你的工程就識(shí)別Cstring類了。

2:在你的工程設(shè)置中,在General頁(yè)中,選擇“MFC”為“Using MFC in a shared DLL”

OK,現(xiàn)在再編譯你的工程即可。
回復(fù)人: zhengyun_ustc(^-^) (2001-11-12 12:06:56) 得5分
_variant_t的bstrVal成員是BSTR類型。
它是一個(gè)指向一個(gè)OLECHART*的指針。
回復(fù)人: vickowang(小蒼) (2001-11-12 12:48:21) 得5分
(char *)_bstr_t(vfirstname)
回復(fù)人: smallfool(smallfool) (2001-11-12 13:52:54) 得4分
或許你還需要一個(gè)從UNICODE字符到ANSI字符的轉(zhuǎn)變函數(shù)
回復(fù)人: sun_1112(蕭) (2001-11-12 17:34:44) 得0分
謝謝大家
給我這么大的支持!:)
回復(fù)人: zhengyun_ustc(^-^) (2001-11-14 13:24:07) 得0分
用vickowang(小蒼)的意見(jiàn)可能會(huì)有問(wèn)題,轉(zhuǎn)換出的字符串應(yīng)該是亂碼。

因?yàn)?char *)轉(zhuǎn)換需要一個(gè)const的字符串資源,才能強(qiáng)制轉(zhuǎn)換。
所以應(yīng)該:
_bstr_t bstrTemp = _bstr_t(vfirstname.bstrVal);
TCHAR szTemp[MAX_PATH];
szTemp = (char*)bstrTemp;

9。char * 轉(zhuǎn)換為T(mén)CHAR類型??
直接轉(zhuǎn)換,TCHAR相當(dāng)于char了
char * s;
TCHAR * s1=(TCHAR *)s;
回復(fù)人: dysxq() (2001-12-21 21:26:25) 得0分
要看你的程序設(shè)置是ANSI還是UNICODE, 如果是ANSI,直接轉(zhuǎn),如果是UNICODE,TCHAR相當(dāng)于WCHAR, 要用mbstowcsz轉(zhuǎn)一下
回復(fù)人: xiaoxiaohan(蕭曉寒) (2001-12-21 23:52:17) 得0分
Unicode :寬字節(jié)字符集
1. 如何取得一個(gè)既包含單字節(jié)字符又包含雙字節(jié)字符的字符串的字符個(gè)數(shù)?
可以調(diào)用Microsoft Visual C++的運(yùn)行期庫(kù)包含函數(shù)_mbslen來(lái)操作多字節(jié)(既包括單字節(jié)也包括雙字節(jié))字符串。
調(diào)用strlen函數(shù),無(wú)法真正了解字符串中究竟有多少字符,它只能告訴你到達(dá)結(jié)尾的0之前有多少個(gè)字節(jié)。
2. 如何對(duì)DBCS(雙字節(jié)字符集)字符串進(jìn)行操作?
函數(shù) 描述
PTSTR CharNext ( LPCTSTR ); 返回字符串中下一個(gè)字符的地址
PTSTR CharPrev ( LPCTSTR, LPCTSTR ); 返回字符串中上一個(gè)字符的地址
BOOL IsDBCSLeadByte( BYTE ); 如果該字節(jié)是DBCS字符的第一個(gè)字節(jié),則返回非0值
3. 為什么要使用Unicode?
(1) 可以很容易地在不同語(yǔ)言之間進(jìn)行數(shù)據(jù)交換。
(2) 使你能夠分配支持所有語(yǔ)言的單個(gè)二進(jìn)制.exe文件或DLL文件。
(3) 提高應(yīng)用程序的運(yùn)行效率。
Windows 2000是使用Unicode從頭進(jìn)行開(kāi)發(fā)的,如果調(diào)用任何一個(gè)Windows函數(shù)并給它傳遞一個(gè)ANSI字符串,那么系統(tǒng)首先要將字符串轉(zhuǎn)換成
Unicode,然后將Unicode字符串傳遞給操作系統(tǒng)。如果希望函數(shù)返回ANSI字符串,系統(tǒng)就會(huì)首先將Unicode字符串轉(zhuǎn)換成ANSI字符串,然后將結(jié)
果返回給你的應(yīng)用程序。進(jìn)行這些字符串的轉(zhuǎn)換需要占用系統(tǒng)的時(shí)間和內(nèi)存。通過(guò)從頭開(kāi)始用Unicode來(lái)開(kāi)發(fā)應(yīng)用程序,就能夠使你的應(yīng)用程序
更加有效地運(yùn)行。
Windows CE 本身就是使用Unicode的一種操作系統(tǒng),完全不支持ANSI Windows函數(shù)
Windows 98 只支持ANSI,只能為ANSI開(kāi)發(fā)應(yīng)用程序。
Microsoft公司將COM從16位Windows轉(zhuǎn)換成Win32時(shí),公司決定需要字符串的所有COM接口方法都只能接受Unicode字符串。
4. 如何編寫(xiě)Unicode源代碼?
Microsoft公司為Unicode設(shè)計(jì)了WindowsAPI,這樣,可以盡量減少代碼的影響。實(shí)際上,可以編寫(xiě)單個(gè)源代碼文件,以便使用或者不使用
Unicode來(lái)對(duì)它進(jìn)行編譯。只需要定義兩個(gè)宏(UNICODE和_UNICODE),就可以修改然后重新編譯該源文件。
_UNICODE宏用于C運(yùn)行期頭文件,而UNICODE宏則用于Windows頭文件。當(dāng)編譯源代碼模塊時(shí),通常必須同時(shí)定義這兩個(gè)宏。
5. Windows定義的Unicode數(shù)據(jù)類型有哪些?
數(shù)據(jù)類型 說(shuō)明
WCHAR Unicode字符
PWSTR 指向Unicode字符串的指針
PCWSTR 指向一個(gè)恒定的Unicode字符串的指針
對(duì)應(yīng)的ANSI數(shù)據(jù)類型為CHAR,LPSTR和LPCSTR。
ANSI/Unicode通用數(shù)據(jù)類型為T(mén)CHAR,PTSTR,LPCTSTR。
6. 如何對(duì)Unicode進(jìn)行操作?
字符集 特性 實(shí)例
ANSI 操作函數(shù)以str開(kāi)頭 strcpy
Unicode 操作函數(shù)以wcs開(kāi)頭 wcscpy
MBCS 操作函數(shù)以_mbs開(kāi)頭 _mbscpy
ANSI/Unicode 操作函數(shù)以_tcs開(kāi)頭 _tcscpy(C運(yùn)行期庫(kù))
ANSI/Unicode 操作函數(shù)以lstr開(kāi)頭 lstrcpy(Windows函數(shù))
所有新的和未過(guò)時(shí)的函數(shù)在Windows2000中都同時(shí)擁有ANSI和Unicode兩個(gè)版本。ANSI版本函數(shù)結(jié)尾以A表示;Unicode版本函數(shù)結(jié)尾以W表示。
Windows會(huì)如下定義:
#ifdef UNICODE
#define CreateWindowEx CreateWindowExW
#else
#define CreateWindowEx CreateWindowExA
#endif // !UNICODE
7. 如何表示Unicode字符串常量?
字符集 實(shí)例
ANSI “string”
Unicode L“string”
ANSI/Unicode T(“string”)或_TEXT(“string”)if( szError[0] == _TEXT(‘J’) ){ }
8. 為什么應(yīng)當(dāng)盡量使用操作系統(tǒng)函數(shù)?
這將有助于稍稍提高應(yīng)用程序的運(yùn)行性能,因?yàn)椴僮飨到y(tǒng)字符串函數(shù)常常被大型應(yīng)用程序比如操作系統(tǒng)的外殼進(jìn)程Explorer.exe所使用。由于
這些函數(shù)使用得很多,因此,在應(yīng)用程序運(yùn)行時(shí),它們可能已經(jīng)被裝入RAM。
如:StrCat,StrChr,StrCmp和StrCpy等。
9. 如何編寫(xiě)符合ANSI和Unicode的應(yīng)用程序?
(1) 將文本串視為字符數(shù)組,而不是chars數(shù)組或字節(jié)數(shù)組。
(2) 將通用數(shù)據(jù)類型(如TCHAR和PTSTR)用于文本字符和字符串。
(3) 將顯式數(shù)據(jù)類型(如BYTE和PBYTE)用于字節(jié)、字節(jié)指針和數(shù)據(jù)緩存。
(4) 將TEXT宏用于原義字符和字符串。
(5) 執(zhí)行全局性替換(例如用PTSTR替換PSTR)。
(6) 修改字符串運(yùn)算問(wèn)題。例如函數(shù)通常希望在字符中傳遞一個(gè)緩存的大小,而不是字節(jié)。這意味著不應(yīng)該傳遞sizeof(szBuffer),而應(yīng)該傳
遞(sizeof(szBuffer)/sizeof(TCHAR)。另外,如果需要為字符串分配一個(gè)內(nèi)存塊,并且擁有該字符串中的字符數(shù)目,那么請(qǐng)記住要按字節(jié)來(lái)
分配內(nèi)存。這就是說(shuō),應(yīng)該調(diào)用malloc(nCharacters *sizeof(TCHAR)),而不是調(diào)用malloc(nCharacters)。
10. 如何對(duì)字符串進(jìn)行有選擇的比較?
通過(guò)調(diào)用CompareString來(lái)實(shí)現(xiàn)。
標(biāo)志 含義
NORM_IGNORECASE 忽略字母的大小寫(xiě)
NORM_IGNOREKANATYPE 不區(qū)分平假名與片假名字符
NORM_IGNORENONSPACE 忽略無(wú)間隔字符
NORM_IGNORESYMBOLS 忽略符號(hào)
NORM_IGNOREWIDTH 不區(qū)分單字節(jié)字符與作為雙字節(jié)字符的同一個(gè)字符
SORT_STRINGSORT 將標(biāo)點(diǎn)符號(hào)作為普通符號(hào)來(lái)處理
11. 如何判斷一個(gè)文本文件是ANSI還是Unicode?
判斷如果文本文件的開(kāi)頭兩個(gè)字節(jié)是0xFF和0xFE,那么就是Unicode,否則是ANSI。
12. 如何判斷一段字符串是ANSI還是Unicode?
用IsTextUnicode進(jìn)行判斷。IsTextUnicode使用一系列統(tǒng)計(jì)方法和定性方法,以便猜測(cè)緩存的內(nèi)容。由于這不是一種確切的科學(xué)方法,因此
IsTextUnicode有可能返回不正確的結(jié)果。
13. 如何在Unicode與ANSI之間轉(zhuǎn)換字符串?
Windows函數(shù)MultiByteToWideChar用于將多字節(jié)字符串轉(zhuǎn)換成寬字符串;函數(shù)WideCharToMultiByte將寬字符串轉(zhuǎn)換成等價(jià)的多字節(jié)字符串。

回復(fù)人: xtky_limi(痛在心中笑在臉上) (2001-12-22 0:35:58) 得0分
上面說(shuō)的已經(jīng)比較全了。
回復(fù)人: xtky_limi(痛在心中笑在臉上) (2001-12-22 0:38:13) 得0分
TEXT是宏
相當(dāng)于L##

它可以根據(jù)編譯環(huán)境確定為DBMS,還是UNICODE字符集

10。int類型轉(zhuǎn)換為CString類型?
回復(fù)人: tjmxf(天涯) (2001-12-17 19:59:34) 得0分
itoa()
回復(fù)人: zf925(天下哪來(lái)那么多高手) (2001-12-17 20:00:30) 得22分
char m[20];
str=str + itoa(i,m,10);
回復(fù)人: yuezifeng(wybzd) (2001-12-17 20:00:50) 得22分
CString str;
str.Format("%d",i);

回復(fù)人: kingfish(今飛) (2001-12-17 20:06:27) 得0分
str.Format("%s%d",str,i);
回復(fù)人: tanyajun(談子) (2001-12-17 20:09:25) 得0分
CString str="test";
int i=11;
CString str1;
str1.Format("%d",i);
str = str+str1;

回復(fù)人: guanjinke(綸巾客) (2001-12-17 20:10:42) 得0分
int i=11;
CString str="test";
CString addition;
addition.Format("%d",i);
str+=addition;
就可以了。

11。關(guān)于sprintf類型轉(zhuǎn)換的問(wèn)題
sprintf(buf,"select price from ls01 where p_date>='%'",t_date)
其中t_date是CTime類型,%后面應(yīng)該是什么呢?%s是String類型,%c是char,那么CTime型對(duì)應(yīng)的是什么呢?
?
回復(fù)人: yakai(日落長(zhǎng)河) (2001-12-17 17:45:47) 得0分
sprintf(buf,"select price from ls01 where p_date>='%S'",(LPCSTR)t_date.Format( "%A, %B %d, %Y" ));
如果不行,就
char temp[50];
CString str=t_date.Format( "%A, %B %d, %Y" );
strcpy(temp,(LPCSTR)str);
sprintf(buf,"select price from ls01 where p_date>='%S'",temp);
CTime::Format返回CString
回復(fù)人: loh(樂(lè)嘯天涯) (2001-12-17 17:52:57) 得0分
wait

don't know
回復(fù)人: masterz() (2001-12-17 20:21:05) 得0分
SQL語(yǔ)句中日期要寫(xiě)成字符串"yyyymmdd"


12。類型轉(zhuǎn)換 unsigned int <==>CString??
回復(fù)次數(shù):8
發(fā)表時(shí)間:2001-12-17 10:25:23

unsigned int f;//unsigned int 0~4294967295
CString g;
f=2300000000;
g.Format("%d",f);
AfxMessageBox(g);
出錯(cuò)。?


回復(fù)人: ydogg(灰毛兔頻頻) (2001-12-17 10:31:29) 得0分
unsigned int f;//unsigned int 0~4294967295
CString g;
f=2300000000;
g.Format("%d",f);
MessageBox(g);//使用AfxMessageBox,需要窗口的句炳參數(shù)

回復(fù)人: asdmusic8(asdmusic8) (2001-12-17 10:35:15) 得0分
我 AfxMessageBox(g); 和MessageBox(g); 都不錯(cuò)。
錯(cuò)的是g.從 2300000000=》1994967296

回復(fù)人: asdmusic8(asdmusic8) (2001-12-17 10:36:10) 得0分
是2300000000=》-1994967296 類型轉(zhuǎn)換錯(cuò)。

回復(fù)人: ydogg(灰毛兔頻頻) (2001-12-17 10:37:54) 得6分
g.Format("%u",f);

回復(fù)人: asdmusic8(asdmusic8) (2001-12-17 10:40:24) 得0分
to dgsnmpoperate 那怎么從 CString ==>>unsigned int
回復(fù)人: kingfish(今飛) (2001-12-17 10:42:10) 得6分
既然是 unsigned int,
超過(guò) 0x7f000000 (2130706432) 當(dāng)然不能用 %d (signed int)用%u
回復(fù)人: kingfish(今飛) (2001-12-17 10:44:57) 得8分
CString ==>>unsigned int?
char *p = (LPSTR)(LPCSTR) g;
f = atoi(p);

13。static_cast、dynamic_cast 和直接類型轉(zhuǎn)換(如 (void *)p )的區(qū)別?
發(fā)表時(shí)間:2001-12-14 9:31:13

先拷貝MSDN中的一小段話:
class B { ... };
class C : public B { ... };
class D : public C { ... };

void f(D* pd)
{
C* pc = dynamic_cast<C*>(pd); // ok: C is a direct base class
// pc points to C subobject of pd

B* pb = dynamic_cast<B*>(pd); // ok: B is an indirect base class
// pb points to B subobject of pd
...
}
我已經(jīng)知道 static_cast 和 dynamic_cast 的作用,但MSDN中并沒(méi)有提到這兩個(gè)操作符與直接類型轉(zhuǎn)換如
void f(D* pd)
{
C* pc = (C*)(pd);

B* pb = (B*)(pd);
...
}
的不同啊。不知道那位知道的告訴一聲,在此不勝感謝,50分奉上。

回復(fù)貼子:ysdesigned(清泉) (2001-12-14 10:03:07) 得0分
static_cast、dynamic_cast 代 替 簡(jiǎn) 單 的 強(qiáng) 制 轉(zhuǎn) 化, 從 而 消 除 多 繼 承 帶 來(lái) 的 歧 義。 使 用 這 兩 個(gè) 運(yùn) 算 符 號(hào), 我 們可以 在 對(duì) 象 運(yùn) 行 過(guò) 程 中 獲 取 對(duì) 象 的 類 型 信 息
dynamic_cast 用于多態(tài)類型的轉(zhuǎn)換
static_cast 用于非多態(tài)類型的轉(zhuǎn)換

回復(fù)人: masterz() (2001-12-14 10:05:48) 得0分
static_cast<...>compile時(shí)能發(fā)現(xiàn)不正確的指針類型轉(zhuǎn)換
dynamic_cast<...>運(yùn)行時(shí)如果發(fā)現(xiàn)是不正確的指針類型轉(zhuǎn)換會(huì)返回NULL
(void*)強(qiáng)制轉(zhuǎn)換,如果是不正確的指針類型轉(zhuǎn)換,沒(méi)有辦法檢查,不如上面2中安全
回復(fù)人: meady() (2001-12-14 11:29:05) 得0分
類型安全
回復(fù)人: bluecrest(為什么我的VC還是那么的菜) (2001-12-14 11:45:34) 得0分
com技術(shù)內(nèi)幕介紹過(guò)
我剛看完就忘了

14。byte數(shù)據(jù)類型轉(zhuǎn)換成int型??
我用byte型讀進(jìn)一組數(shù)據(jù)想把他轉(zhuǎn)成int型進(jìn)行運(yùn)算如何做呢?
如果再把int型轉(zhuǎn)回byte又怎么實(shí)現(xiàn)呢?

回復(fù)人: louifox(蘭陵笑笑生) (2001-12-6 9:18:38) 得0分
用下面這些宏:
WORD MAKEWORD(
BYTE bLow,
BYTE bHigh
);
BYTE LOBYTE(
WORD wValue
);
BYTE HIBYTE(
WORD wValue
);

回復(fù)人: chskim(大刀闊斧) (2001-12-6 9:21:04) 得0分
int i;
BYTE b;
b=128;
i=(int)b;

回復(fù)人: nannet(似的) (2001-12-6 9:38:24) 得0分
這個(gè)宏怎么用呀?有沒(méi)有簡(jiǎn)單一點(diǎn)兒的,我現(xiàn)在能把BYTE 轉(zhuǎn)成INT 型了,再轉(zhuǎn)回去直接賦值可以嗎?
回復(fù)人: louifox(蘭陵笑笑生) (2001-12-6 9:46:24) 得20分
WORD wa;
BYTE ba=32,bb=64;
wa=MAKEWORD(ba,bb);
...
WORD wa=1234;
BYTE ba,bb;
ba=LOBYTE(wa);
bb=LOBYTE(wa);

回復(fù)人: nannet(似的) (2001-12-6 9:54:55) 得0分
問(wèn)題解決了,多謝各位

15。類型轉(zhuǎn)換的問(wèn)題,unsigned int --> lptstr/lpctstr??
發(fā)表時(shí)間:2001-8-7 23:49:41
如果強(qiáng)制轉(zhuǎn)換的話,會(huì)出現(xiàn)致命錯(cuò)誤,有什么好的辦法呢?
能列舉一些其他的辦法嗎?
謝謝大蝦!

回復(fù)人: AlphaOne(總是第一個(gè)倒下) (2001-8-8 0:02:43) 得5分
你為什么要強(qiáng)行轉(zhuǎn)換呢?
如果你是要把int 的值作為 lptstr/lpctstr 的內(nèi)容的話,
可以用CString:
unsigned int a = 100;
LPCTSTR lpText;
CString str;
str.Format("%d",a);
lpText = (LPCTSTR)str;

回復(fù)人: tryibest(編の魂) (2001-8-8 8:20:20) 得5分
wsprintf(str,"%u",ui);
回復(fù)人: zzh() (2001-8-8 9:04:39) 得5分
這種情況不需要進(jìn)行強(qiáng)制轉(zhuǎn)換,直接使用wsprintf就可以了。
回復(fù)人: GJA106(中文字符) (2001-8-8 10:10:51) 得5分
unsigned int m_na=22;
LPTSTR lptstr;
wsprintf(lptstr,"%u",m_na);

16。關(guān)于COM類型轉(zhuǎn)換問(wèn)題??
我定義了兩個(gè)變量,一個(gè)是void *piaRef=new unsigned char[1000];另一個(gè)是m_Temp=new CComVariant();我的問(wèn)題是如何將piaRef中的值
COPY到m_Temp中。

回復(fù)人: nichang() (2001-11-21 15:34:04) 得0分
CComBSTR bsRef=piaRef;
m_Temp=bsRef.copy()
回復(fù)人: VincentChin(瘟神) (2001-11-21 17:04:24) 得0分
CComBSTR bsRef=piaRef;
//error C2440: 'initializing' : cannot convert from 'void *' to 'class ATL::CComBSTR'
m_Temp=bsRef.copy();
//error C2440: '=' : cannot convert from 'unsigned short *' to 'class ATL::CComVariant *'
回復(fù)人: nichang() (2001-11-21 17:14:28) 得0分
將void*改為unsigned char *
回復(fù)人: VincentChin(瘟神) (2001-11-21 17:22:22) 得0分
我用CComBSTR bsRef=(unsigned char*)piaRef,也不行嗎?
回復(fù)人: VincentChin(瘟神) (2001-11-21 17:28:06) 得0分
會(huì)報(bào)錯(cuò):
error C2440: 'type cast' : cannot convert from 'unsigned char *' to 'class ATL::CComBSTR'
回復(fù)人: nichang() (2001-11-22 9:12:14) 得0分
m_Temp=::SysAllocString((OLECHAR *)piaRef)
回復(fù)人: VincentChin(瘟神) (2001-11-22 10:43:07) 得0分
//error C2440: '=' : cannot convert from 'unsigned short *' to 'class ATL::CComVariant *'
回復(fù)人: VincentChin(瘟神) (2001-11-22 11:22:35) 得0分
m_Temp=new CComVariant(::SysAllocString(OLECHAR *)piaRef));沒(méi)有出錯(cuò),但是我的m_Temp是COM組件中的一個(gè)PROPERTY,我想返回的是
unsigned char類型(單字節(jié)),但經(jīng)過(guò)上述轉(zhuǎn)換后,就不再是單字節(jié)了呀!怎么辦?
回復(fù)人: jiangsheng(蔣晟) (2001-11-22 11:36:58) 得0分
把這個(gè)屬性的類型改成BSTR
回復(fù)人: GrayWhite(灰白) (2001-11-22 12:01:09) 得0分
m_Temp = new CComVariant((char*) piaRef);就可以了。VB就是用的BSTR,你要給誰(shuí)用阿?VC不用VARIANT的。
回復(fù)人: GrayWhite(灰白) (2001-11-22 12:18:18) 得19分
哦,我明白了,你要各字節(jié)數(shù)組:
SAFEARRAY *psa = SafeArrayCreateVector(VT_UI1, 0, 1000);
if (!psa)
_com_issue_error(ERROR_NOT_ENOUGH_MEMORY);

HRESULT hr
for (long i = 0; i < 2; i ++)
{
if (FAILED (hr = SafeArrayPutElement(psa, &i, piaRef + i)))
_com_issue_error(hr);
}

_variant_t va; // include <comdef.h>
va.vt = VT_ARRAY | VT_UI1;
va.parray = psa;

m_Temp = new CComVariant(va);
回復(fù)人: VincentChin(瘟神) (2001-11-22 14:21:08) 得0分
SafeArrayPutElement(psa, &i, piaRef + i)
//error C2036: 'void *' : unknown size
回復(fù)人: VincentChin(瘟神) (2001-11-22 14:46:05) 得0分
To GrayWhite:為什么要for(long i=0;i<2;i++)?
回復(fù)人: nichang() (2001-11-22 15:16:35) 得0分
到底你想怎樣轉(zhuǎn)換嘛,是將數(shù)組內(nèi)的值拷貝到CComVariant中存為字符串嗎?
回復(fù)人: VincentChin(瘟神) (2001-11-22 15:28:35) 得0分
我是想把piaRef中的值照原樣返回給其它程序使用。我正在做的是一個(gè)COM組件。謝謝各位!
回復(fù)人: nichang() (2001-11-22 15:34:40) 得10分
unsigned char *s=new unsigned char[1000];
strcpy((char*)s,"1234");//可以用你自己方法設(shè)置s中的值。
BSTR bstrS;
oleS=A2WBSTR((char*)s);//將char*轉(zhuǎn)換成BSTR類型

CComVariant comVT;
comVT=oleS;//將BSTR轉(zhuǎn)成CComVariant,這里一步也可,comVT=A2WBSTR((char*)s);

回復(fù)人: VincentChin(瘟神) (2001-11-22 16:54:07) 得0分
謝謝你!
但我還有一個(gè)問(wèn)題,就是如果在s中有'\0'之類的東西我該怎么返回呢?char *遇到'\0'會(huì)認(rèn)為到頭了。完整的設(shè)計(jì)是這樣的,我定義一個(gè)void * 用來(lái)從一個(gè)外部設(shè)備獲取數(shù)據(jù),該數(shù)據(jù)應(yīng)該是unsigned char,我想把這個(gè)返回的數(shù)據(jù)作為屬性傳出,讓其它應(yīng)用使用(如VB)。
回復(fù)人: nichang() (2001-11-22 17:18:09) 得0分
將'\0'轉(zhuǎn)換成其它如'\1'就OK了,
回復(fù)人: jiangsheng(蔣晟) (2001-11-22 18:07:16) 得0分
用字符串?dāng)?shù)組
回復(fù)人: VincentChin(瘟神) (2001-11-23 15:54:39) 得0分
謝謝各位的回復(fù)!我的問(wèn)題解決了!如下:
SAFEARRAY *psa = SafeArrayCreateVector(VT_UI1, 0, 1000);
if (!psa)
return S_FALSE;
HRESULT hr;
for (long i = 0; i < 1000; i ++)
if (FAILED (hr = SafeArrayPutElement(psa, &i, ((unsigned char*)piaRefTemplate) + i)))
return S_FALSE;
VARIANT va;
va.vt = VT_ARRAY | VT_UI1;
va.parray = psa;
CComVariant *m_Temp = new CComVariant();
m_Temp->Copy(&va);

17。類型轉(zhuǎn)換 static_cast reinterprete_cast 的區(qū)別??
static_cast reinterprete_cast 的區(qū)別

回復(fù)人: tar(GPS) (2001-11-21 10:06:41) 得0分
static_cast會(huì)檢查轉(zhuǎn)換類型健的相關(guān)性
如果沒(méi)有的畫(huà)會(huì)有編譯錯(cuò)誤
reinterprete_cast就是硬轉(zhuǎn)了
回復(fù)人: tigerwoods(tao) (2001-11-21 12:28:19) 得0分
是否可以這樣理解:在多重繼承中,static_cast可實(shí)現(xiàn)對(duì)象指針的移動(dòng),從而指向正確的父類對(duì)象部分,而reinterprete_cast不作偏移?
回復(fù)人: liu_feng_fly(我恨死驅(qū)動(dòng)程序了,哎,就是為了混口飯吃) (2001-11-21 12:35:14) 得0分
在多重繼承中可以用dynamic_cast啊

18。那如何取得CString中的字符串??
回復(fù)人: nichang() (2001-11-5 17:06:00) 得0分
=(LPCTSTR)CString變量
回復(fù)人: snake1122(領(lǐng)悟) (2001-11-5 17:12:16) 得0分
方法太多了:
GetAt,Left,Mid,Right等等,就看你怎么取了!
回復(fù)人: dusb(保時(shí)捷) (2001-11-5 17:34:29) 得0分
可是不管是GetAt,Left,Mid,Right返回類型都是CString,還是不能用,我是要取其中的字符串,奇怪的是,VC中沒(méi)有string類型。(我要的字符串是給樹(shù)型控件中的分支名稱)
回復(fù)人: Alps_lou(云飛揚(yáng)) (2001-11-5 17:41:36) 得0分
有string類型的啊,要包含<string>
回復(fù)人: luxes() (2001-11-5 17:42:19) 得0分
加上(LPCTSTR),相當(dāng)于一個(gè)const char *了,還不能用?
回復(fù)人: wt007(tt) (2001-11-5 17:48:33) 得0分
GetBuffer
回復(fù)人: espon99() (2001-11-5 17:54:06) 得20分
(LPSTR)(LPCTSTR)

回復(fù)人: ineedyou(古寺僧) (2001-11-5 17:59:29) 得0分
...m_str.GetBuffer(needlen)...;
....
m_str.ReleaseBuffer()
回復(fù)人: dusb(保時(shí)捷) (2001-11-6 15:08:36) 得0分
espon99大俠,果然是絕招,不過(guò)能否解釋一下啊?

19。如何從CString類型轉(zhuǎn)換為Unicode string 類型?
回復(fù)人: ychener(貧血) (2001-10-20 10:28:48) 得0分
CString本身就支持Unicode的。
只要你選擇的是UniCode編譯,生成的可執(zhí)行程序就是支持UniCode的

回復(fù)人: ychener(貧血) (2001-10-20 10:30:04) 得0分
CString類是自適應(yīng)的就像TCHAR一樣,如果你定義了UniCode宏 就會(huì)以UniCode編譯

回復(fù)人: xjl1980_81(阿龍) (2001-10-20 10:35:16) 得0分
不是呀,我有個(gè)函數(shù)中有一個(gè)參數(shù)需Unicode string 類型的,比如應(yīng)該填L"abc",而且引號(hào)中的內(nèi)容要有變化,現(xiàn)在我有一個(gè) temp變量,是CString類型的,如何用呀?
回復(fù)人: xt_jat(桑巴) (2001-10-20 10:39:37) 得0分
_T()
_TEXT()
行不行?
回復(fù)人: xjl1980_81(阿龍) (2001-10-20 10:43:18) 得0分
不行
回復(fù)人: Jeffery__Chen() (2001-10-20 11:04:53) 得0分
強(qiáng)制轉(zhuǎn)化:
CString temp;
WCHAR wTemp = (WCHAR)temp;
回復(fù)人: xjl1980_81(阿龍) (2001-10-20 11:37:06) 得0分
to:Jeffery__Chen() 
不對(duì)呀,出現(xiàn)不能轉(zhuǎn)換的錯(cuò)誤
回復(fù)人: hongzhh(關(guān)兒) (2001-10-20 11:39:42) 得0分
問(wèn)題是這樣的:
temp 是 CString類型變量,值為zhh
現(xiàn)在有一個(gè)API
PCCERT_CONTEXT WINAPI CertFindCertificateInStore(
HCERTSTORE hCertStore,
DWORD dwCertEncodingType,
DWORD dwFindFlags,
DWORD dwFindType,
const void *pvFindPara, //此處用 L"zhh" 沒(méi)問(wèn)題
//請(qǐng)問(wèn)怎么轉(zhuǎn)換 可以 用temp

PCCERT_CONTEXT pPrevCertContext
);

在此謝謝大家,請(qǐng)幫忙看看

回復(fù)人: hongzhh(關(guān)兒) (2001-10-20 13:27:10) 得0分
WCHAR wszDomain[256];
MultiByteToWideChar( CP_ACP, 0, temp,
strlen(temp)+1, wszUserName,
sizeof(wszUserName)/sizeof(wszUserName[0]) );


wszUserName就是轉(zhuǎn)換后的值

回復(fù)人: ychener(貧血) (2001-10-23 11:43:05) 得0分
只要你用的是CString的函數(shù)就行的,如果你要用類似strcpy函數(shù)時(shí),看看MSDN中一般情況下都有響應(yīng)的函數(shù)對(duì)于Unicode的。只要換成_tcscpy等等。
回復(fù)人: ychener(貧血) (2001-10-23 11:44:10) 得0分
你有沒(méi)有定義Unicode宏??
20。請(qǐng)問(wèn)在用ATL且不支持MFC的組件開(kāi)發(fā)中,如何將從數(shù)據(jù)庫(kù)中讀到的DATE數(shù)據(jù)類型轉(zhuǎn)換回為字符串??

復(fù)人: zhxuys(zhxuys) (2001-9-24 10:36:47) 得0分
ATL把datetime類型的列映射為DBTIMESTAMP類型,可取出該類型的year、month、day等,然后將這些數(shù)據(jù)傳遞回客戶端,在客戶端用CTime來(lái)構(gòu)造
回復(fù)人: YUANXU(旭) (2001-9-24 11:18:14) 得0分
to zhxuys:CTime是MFC類,在ATL 不支持MFC時(shí)不能用。DATE其實(shí)質(zhì)是個(gè)double*
回復(fù)人: zhxuys(zhxuys) (2001-9-24 11:57:01) 得0分
你在客戶端與服務(wù)器端只用ATL規(guī)定的數(shù)據(jù)類型或VARIANT類型,而在客戶端,可以用MFC來(lái)重新構(gòu)造想要的數(shù)據(jù)結(jié)構(gòu)

21。類型轉(zhuǎn)換,CString to wchar_t ??

CString ss("aabb");
wchar_t* cc;
cc=ss.AllocSysString();

22。如何將CString類型轉(zhuǎn)換為_(kāi)bstr_t類型?
回復(fù)人: wei97081116(韋小寶) (2001-9-4 11:19:30) 得20分
CString b;
_bstr_t a;
a=(_bstr_t)b;

回復(fù)人: zhaozhen1212(趙振) (2001-9-18 1:30:18) 得0分
_bstr_t a=b.AllocSysString();;

23。如何把一個(gè)CString類型轉(zhuǎn)換成一個(gè)普通的字符串,如char*?

回復(fù)人: liu_feng_fly(我恨死驅(qū)動(dòng)程序了,哎,就是為了混口飯吃) (2001-9-17 18:00:52) 得0分
所以,直接用就可以,因?yàn)轭惱镞呌羞@樣的轉(zhuǎn)換函數(shù)
回復(fù)人: ydogg(灰毛兔頻頻) (2001-9-17 18:01:21) 得0分
CString show;

char *p = show.GetBuffer(show.GetLength());
回復(fù)人: jiangping_zhu(娜可露露之風(fēng)之刃) (2001-9-17 18:02:05) 得0分
(char*)(LPCTSTR)str
回復(fù)人: bmouse(老鼠) (2001-9-18 0:10:56) 得0分
同意樓上!
回復(fù)人: bmouse(老鼠) (2001-9-18 0:13:22) 得0分
你還可以通過(guò)GetBuff來(lái)直接操作CString的緩沖區(qū),不過(guò)要記著釋放緩沖區(qū).

24。CString 類型轉(zhuǎn)換成 unsigned char類型嗎??
回復(fù)人: LJN(*)風(fēng)流倜儻無(wú)人及,玉樹(shù)偏又臨風(fēng)立(*) (2001-9-17 12:46:01) 得0分
可以用CString.GetBuffer函數(shù)
回復(fù)人: xpmao() (2001-9-17 13:09:09) 得0分
CString strWork;
MessageBox(0,(LPSTR)strWork,0,0);
或MessageBox(0,strWork.GetBuffer(0),0,0);

回復(fù)人: sandd(降龍掌) (2001-9-17 13:17:32) 得0分
CString string;

(LPCTSTR)string;
回復(fù)人: jeff_hunter(PandaLee) (2001-9-17 13:45:30) 得0分
(unsigned char *)(LPCTSTR)
回復(fù)人: fandh(好了) (2001-9-17 14:00:57) 得0分
用(unsigned char *)(LPCTSTR)即可?
回復(fù)人: ygd(ygd) (2001-9-17 16:11:17) 得0分
unsigned char *p;
CString str;
int length=str.GetLength();
for(int i=0;i<length;i++)
p[i]=str.GetAt(i);
回復(fù)人: swordbroken(斷劍書(shū)生) (2001-9-17 16:25:57) 得0分
CString str;
unsigned char string[30];
strcpy(string,str);

25。何將一個(gè)unsigned int 類型變量值賦給類型為unsigned short的變量,并保證數(shù)值不丟失(當(dāng)然數(shù)值在一定范圍內(nèi))?
回復(fù)人: maxsuy(魔法師兔子) (2001-8-14 16:37:30) 得0分
直接=就OK了
回復(fù)人: oppmm(ppmm) (2001-8-14 16:38:11) 得0分
直接賦值
回復(fù)人: milefo(彌勒佛) (2001-8-14 16:40:40) 得0分
如果數(shù)值在一定范圍內(nèi)怎么回丟失呢?
unsigned short a;
unsigned int b;
a=( b & 0xffff);
你試試看吧!

26。CString ----char*
定義了char* aa的變量,現(xiàn)在有一個(gè)CString的變量bb,怎樣把bb的值賦給aa呢?

回復(fù)人: emmai(WaTaXiWaWaTaXi) (2001-8-10 11:57:33) 得0分
aa=bb.GetBuffer();
回復(fù)人: hswqs(??????????????????) (2001-8-10 11:59:01) 得0分
aa= (LPSTR)(LPCTSTR)bb;
回復(fù)人: ydogg(灰毛兔) (2001-8-10 12:27:23) 得0分
1.aa=bb.GetBuffer(bb.GetLenth());//第一種方法
2.aa= (LPSTR)(LPCTSTR)bb; //第二種方法
回復(fù)人: zhizhi() (2001-8-10 13:16:23) 得0分
aa= (char *)(LPCTSTR)bb,hehe

27。在一個(gè)COM的接口函數(shù)中有一個(gè) BSTR* 類型的參數(shù),需要把一個(gè) char * 類型轉(zhuǎn)換為 BSTR* 類型,不知道如何轉(zhuǎn)換? 由于調(diào)用這個(gè)函數(shù)后需要把這個(gè)參數(shù)值再取出來(lái)所以只能用指針,另外在調(diào)用的時(shí)候應(yīng)該用什么類型的數(shù)據(jù)傳遞參數(shù)呢?大蝦幫忙。

BSTR bstr = SysAllocString(L"字符串");
這樣轉(zhuǎn)換,用的時(shí)候你用地址操作符&啊,要不指針還得new

回復(fù)人: yongyue2000i(小呂) (2001-9-9 18:38:26) 得13分
CString str = "abcd";
BSTR bstr = str.AllocSysString();
回復(fù)人: houjzs() (2001-9-9 19:14:44) 得13分
BSTR b = SysAllocString(OLESTR("your string"));

28。要把一個(gè)double的數(shù)字輸出到CEdit控件是否需要類型轉(zhuǎn)換?
回復(fù)人: jiangsheng(蔣晟) (2001-8-24 14:46:17) 得0分
void AFXAPI DDX_Text( CDataExchange* pDX, int nIDC, double& value );
回復(fù)人: xiezhsh(雪中行) (2001-8-24 14:56:22) 得0分
假如你的CEdit相關(guān)的成員變量是Double型的,那根本用不著.(ClassWizard增加成員變量的對(duì)話框中,Variable Type選擇Double可)
回復(fù)人: xiezhsh(雪中行) (2001-8-24 14:58:16) 得0分
假如你的CEdit相關(guān)的成員變量不是Double型的,是CString型,那就需要用ltoa()來(lái)轉(zhuǎn)換成CString型,
回復(fù)人: haven(大天) (2001-8-24 14:58:32) 得0分
m_Edit.Fromat("%l",VarBouble);
updatedata(false);
回復(fù)人: 12345678() (2001-8-24 14:59:54) 得0分
CString m_Edit.Format("%lf", doubleVar);
GetDlgItem(EditID)->SetWindowText(m_strEdit);

29。該如何把 WINDOWPLACEMENT * 轉(zhuǎn)換成 char **類型??

(char**)&pWP

30。怎樣把CString的類型轉(zhuǎn)換成char*型的?
回復(fù)人: dcz(dcz) (2001-8-19 19:13:27) 得5分
// str is CString var
char* temp = strdup(str);
...
free(temp);
回復(fù)人: yu900(疾風(fēng)之狼) (2001-8-19 19:57:25) 得0分
getbuffer();即可!
回復(fù)人: aileen_long(挑戰(zhàn)2001) (2001-8-19 21:10:35) 得0分
同意樓上的意見(jiàn)!
回復(fù)人: czh912() (2001-8-19 21:27:08) 得0分
char buf[20];
printf(buf,"%s",string);

回復(fù)人: casl(casl) (2001-8-19 22:59:44) 得5分
CString s("abc");
char* temp=s.GetBuffer(10);
...
s.ReleaseBuffer();
回復(fù)人: cocia(高亞) (2001-8-19 23:04:23) 得0分
char* temp=s.GetBuffer(10);
10是什么意思啊

回復(fù)人: kevin_dong(夢(mèng)仙人) (2001-8-20 10:26:35) 得0分
// str is CString var
char* temp = strdup(str);
// free
free(temp);
我的這段代碼在一個(gè)程序中能通過(guò)編譯,但是在另外一個(gè)中總是出現(xiàn)cannot convert parameter 1 from 'class CString' to 'const char *'的錯(cuò)誤。str和temp的類型都一樣。這是為什么?

回復(fù)人: dcz(dcz) (2001-8-20 14:13:45) 得0分
you may setting your compiler option to UNICODE, in this case, declare the var:

// str is CString var
_TCHAR* temp = _tcsdup(str);

// free
free(str);

31。SA,SB為兩個(gè)結(jié)構(gòu)類型??
SA* A;
SB* B;
(SB*)A->...(調(diào)用函數(shù))
請(qǐng)問(wèn)此時(shí)A的類型,是指向SA還是SB
此時(shí)編譯器是生成一個(gè)臨時(shí)指針嗎?
另外,
B=(SB*)A;此時(shí)A又是什么類型???

回復(fù)貼子:
回復(fù)人: ddeng(登登) (2001-8-9 17:13:58) 得0分
A的類型始終是SA *
B的類型始終是SB *
當(dāng)進(jìn)行強(qiáng)制類型轉(zhuǎn)換時(shí)使的是臨時(shí)指針
回復(fù)人: gold_water(風(fēng)雨無(wú)阻) (2001-8-9 17:30:46) 得0分
同意樓上的。

32。char buff[100],char UserName[50][100],怎么將buff的值傳給UserName,是其成為UserName數(shù)組中的某一項(xiàng)呢??

//0=<i<50
strcpy(UserName[i],buff);
回復(fù)人: Ashura(阿修羅) (2001-7-26 10:08:20) 得0分
呵呵,benbensan搶先一步。
回復(fù)人: tuita(斗牛士) (2001-7-26 10:13:22) 得0分
for (i=0;i<100;i++)
*(*(username+x)+i)=*(buffer+i)
其中0《X〈50
benbensan寫(xiě)的也對(duì)

回復(fù)人: kekeke(我是來(lái)向大家學(xué)習(xí)的) (2001-7-26 10:24:22) 得0分
那反過(guò)來(lái)呢?把UserName中的某一項(xiàng)讀出賦值給buff呢?怎么弄?
回復(fù)人: benbensan(笨笨三) (2001-7-26 10:26:53) 得0分
//0=<i<50
strcpy(UserName[i],buff);
回復(fù)人: benbensan(笨笨三) (2001-7-26 10:28:15) 得0分
對(duì)不起,能錯(cuò)了,不過(guò)建議你看一下C語(yǔ)言了的指針和數(shù)組
//0=<i<50
strcpy(buff,UserName[i]);

回復(fù)人: jfzsl(剿匪總司令) (2001-7-26 10:32:57) 得0分
好好看看老潭的書(shū)先!OK?
回復(fù)人: kekeke(我是來(lái)向大家學(xué)習(xí)的) (2001-7-26 10:44:25) 得0分
好。。。。!

33。請(qǐng)問(wèn)怎樣把SYSTEMTIME類型轉(zhuǎn)換成time_t類型?
SYSTEMTIME st;
GetLocalTime(&st);
CTime tm(st.wYear,st.wMonth,st.wDay,st.wHour,st.wMinute,st.wSecond);
time_t t = tm.GetTime();

34。unsigned char Exponent[10]; //e
unsigned long eBytes; //e的字節(jié)數(shù)
如何轉(zhuǎn)換成DWord型! ??

用強(qiáng)制類型轉(zhuǎn)換呀
(DWord)eBeytes;
(DWord)Exponent[i];//(0<=i<=10);

回復(fù)人: xjl1980_81(阿龍) (2001-7-26 16:47:29) 得0分
我是說(shuō)把e轉(zhuǎn)換成DWORD型
也就是說(shuō)把Exponent中的內(nèi)容轉(zhuǎn)換成DWORD型

回復(fù)人: cloudshadow1(云影) (2001-7-26 17:13:30) 得0分
用強(qiáng)制類型轉(zhuǎn)換就可以了,(DWORD的高24位自動(dòng)加0)
DWORD Des[10]
for (int i=0;i<11;i++)
Des[i]=Exponent[i];
至于那個(gè)ULONG的也是用強(qiáng)制類型軟換就可以了

35。請(qǐng)問(wèn)怎樣把time_t類型轉(zhuǎn)換成SYSTEMTIME類型?
回復(fù)人: haven(大天) (2001-7-26 17:12:36) 得0分
typedef struct _SYSTEMTIME
typedef long time_t
很明顯不行嘛!
回復(fù)人: facexy(FACE仔) (2001-7-26 17:17:38) 得0分
哎呀,問(wèn)錯(cuò)了,前后對(duì)象相反了;-(
忙昏了的結(jié)果…………

另外,TO 樓上的:
轉(zhuǎn)換是可以的
struct tm *tblock;
SYSTEMTIME SystemTime;
memset(&SystemTime,0,sizeof(SYSTEMTIME));
tblock=localtime(&timer);
SystemTime.wYear=tblock->tm_year+1900;
SystemTime.wMonth=tblock->tm_mon+1;
SystemTime.wDay=tblock->tm_mday;
SystemTime.wHour=tblock->tm_hour;
SystemTime.wMinute=tblock->tm_min;
SystemTime.wSecond=tblock->tm_sec;
SystemTime.wDayOfWeek=tblock->tm_wday;
return &SystemTime;
回復(fù)人: zjh73(大章魚(yú)) (2001-7-26 20:28:28) 得0分
有兩種方法:
1、用CTime類
先用time_t類型構(gòu)造一個(gè)CTime對(duì)象,再定義一個(gè)SYSTEMTIME結(jié)構(gòu),最后用CTime類的成員函數(shù)GetAsSystemTime將時(shí)間轉(zhuǎn)換到SYSTEMTIME結(jié)構(gòu)中
即可。
2、用gmtime函數(shù)
gmtime函數(shù)將time_t時(shí)間轉(zhuǎn)換到tm結(jié)構(gòu)中并返回一個(gè)tm指針,再將tm結(jié)構(gòu)的相對(duì)應(yīng)的項(xiàng)賦給SYSTEMTIME相對(duì)應(yīng)的項(xiàng)即可,不過(guò)用這種方法要注
意這兩種結(jié)構(gòu)在天、星期等方面的記數(shù)方法有點(diǎn)區(qū)別,一個(gè)一般從0開(kāi)始,一個(gè)一般從1開(kāi)始,賦值時(shí)要注意校正,還有要注意的是SYSTEMTIME
結(jié)構(gòu)中有一項(xiàng)是毫秒,而time_t是以秒記數(shù)的。
回復(fù)人: zjh73(大章魚(yú)) (2001-7-26 20:32:13) 得0分
反過(guò)來(lái)也可以用Ctime類的方法
就是先用SYSTEMTIME結(jié)構(gòu)構(gòu)造一個(gè)CTime對(duì)象,在用CTime類中的成員函數(shù)GetTime返回一個(gè)對(duì)應(yīng)的time_t即可。 36。我現(xiàn)在正在學(xué)習(xí)SDK編程,遇到的問(wèn)題是:
我定義了一個(gè)靜態(tài)長(zhǎng)整形變量,
static long lScore=0;
我想把窗口的標(biāo)題換成長(zhǎng)整形數(shù)值,用SetWindowText函數(shù)來(lái)實(shí)現(xiàn),
由于它的第二個(gè)參數(shù)要求數(shù)據(jù)類型為 unsigned short *,但用其來(lái)實(shí)現(xiàn)強(qiáng)制轉(zhuǎn)換時(shí)
總是出現(xiàn)編譯錯(cuò)誤:
cannot convert parameter 2 from 'unsigned short *' to 'const char *'
后來(lái)改成來(lái)LPCTSTR 來(lái)實(shí)現(xiàn)強(qiáng)制轉(zhuǎn)換,沒(méi)有出現(xiàn)編譯錯(cuò)誤,但函數(shù)總是執(zhí)行不成功,
請(qǐng)教各位高人,這倒底是怎么回事???

回復(fù)貼子:
回復(fù)人: prog_st(st) (2001-8-4 21:20:07) 得0分
/* ITOA.C: This program converts integers of various
* sizes to strings in various radixes.
*/

#include <stdlib.h>
#include <stdio.h>

void main( void )
{
char buffer[20];
int i = 3445;
long l = -344115L;
unsigned long ul = 1234567890UL;

_itoa( i, buffer, 10 );
printf( "String of integer %d (radix 10): %s\n", i, buffer );
_itoa( i, buffer, 16 );
printf( "String of integer %d (radix 16): 0x%s\n", i, buffer );
_itoa( i, buffer, 2 );
printf( "String of integer %d (radix 2): %s\n", i, buffer );

_ltoa( l, buffer, 16 );
printf( "String of long int %ld (radix 16): 0x%s\n", l,
buffer );

_ultoa( ul, buffer, 16 );
printf( "String of unsigned long %lu (radix 16): 0x%s\n", ul,
buffer );
}


Output

String of integer 3445 (radix 10): 3445
String of integer 3445 (radix 16): 0xd75
String of integer 3445 (radix 2): 110101110101
String of long int -344115 (radix 16): 0xfffabfcd
String of unsigned long 1234567890 (radix 16): 0x499602d2


回復(fù)人: lwg7603(刑滿釋放人員) (2001-8-4 21:36:15) 得0分
TCHAR str[255]={_T('\0')};
_stprintf(str,_T("%d"),lScore);
SetWindowText(hwnd,str);

37。我用socket發(fā)送的的buf中間需要的是 char *類型的數(shù)據(jù),我想將一個(gè) struct 直接轉(zhuǎn)換成 char * 發(fā)過(guò)去。
我用
struct ABCD *abcd;
char *buf;
abcd = (ABCD *)calloc(1,sizeof(ABCD));
buf = (char *)calloc(1,sizeof(ABCD));
///
給abcd 中間賦值,其中有多個(gè)char[]的值和int 的值
///
memcpy(buf,abcd,sizeof(ABCD));
//strcpy(buf,(char *)abcd);也不可以
sock(host,buf,....);
//sock(host,(char *)buf,...);也不可以
問(wèn)題就是在這里,這個(gè)buf中間的值總是不對(duì),大家知道為什么否。

回復(fù)人: wolf721() (2001-7-30 18:18:34) 得5分
你傳的是個(gè)指針值,而不是數(shù)據(jù)
回復(fù)人: kiko_lee(到處瞧瞧) (2001-7-30 18:50:49) 得0分
但是用memcpy這個(gè)是將整個(gè)數(shù)據(jù)都復(fù)制過(guò)去
回復(fù)人: lz_0618(lz_0618) (2001-7-30 19:26:44) 得5分
你用的VC???改成ABCD *abcd;后編譯一點(diǎn)問(wèn)題也沒(méi)有啊!
sock(host,buf,....);這不知是什么,自定義函數(shù)?

typedef struct _ABCD
{
int ID;
char Name[10];
}ABCD;

.......


ABCD *abcd;
char *buf;
abcd = (ABCD *)calloc(2,sizeof(ABCD));
buf = (char *)calloc(2,sizeof(ABCD));
///
//給abcd 中間賦值,其中有多個(gè)char[]的值和int 的值
abcd[0].ID =1;
abcd[1].ID =2;
///
memcpy(buf,abcd,2*sizeof(ABCD));
strcpy(buf,(char *)abcd);//也不可以

buf中的內(nèi)容也正確!!

回復(fù)人: kiko_lee(到處瞧瞧) (2001-7-31 8:57:52) 得0分
我按照樓上的兄弟說(shuō)的,做了一下,但是仍然做不下來(lái),我用
memcpy(buf,abcd,sizeof(ABCD));
中間的abcd,不知道是不是地址的問(wèn)題。
回復(fù)人: supersusheng(小蘇) (2001-7-31 14:30:42) 得0分
老大,你sizeof()得出的數(shù)值事多大,看看吧。
回復(fù)人: ydogg(灰毛兔) (2001-7-31 14:41:52) 得0分
只能傳遞流數(shù)據(jù),結(jié)構(gòu)是傳遞不過(guò)去的。
回復(fù)人: IamNotMan(NorGirl) (2001-7-31 14:50:53) 得5分
我常這么用
ABCD a ;
//給a的各個(gè)域賦值(一定不能含有指針項(xiàng))
char* buff = new char[sizeof(ABCD)];
memcpy(buff,&a,sizeof(ABCD));
//或者 *(ABCD*)buff = a;
.................
如果buff里的數(shù)對(duì),說(shuō)明問(wèn)題不在這兒吧

回復(fù)人: zb_china(最后一座水車zb_china新浪) (2001-7-31 15:16:24) 得0分
看不明白
回復(fù)人: eggplant(拉拉) (2001-7-31 15:42:48) 得0分
最好使用memcpy(),因?yàn)閟truct中的值有可能包含零字節(jié),所以strcpy()可能不對(duì),如果傳遞struct,最好把struct的字節(jié)對(duì)齊改為以字節(jié)為單位。
回復(fù)人: lvfengxun(lfx) (2001-7-31 16:06:57) 得5分
直接將結(jié)構(gòu)指針作為send的參數(shù)發(fā)就可以了,還用轉(zhuǎn)換什么
有必要在這里討論嗎?
struct AA
{
int a;
char b[100];
};
struct AA aa;
aa.a=11;
strcpy(aa.b,"aaa");
send(hSocket,(char *)(&aa),sizeof(aa),0);
//OK
回復(fù)人: mydewang(mydewang) (2001-7-31 16:33:21) 得0分
其實(shí)這里是一個(gè)字節(jié)對(duì)齊的問(wèn)題,
比如
struct AA
{
int a;
char b;
};
那么sizeof( struct AA )就不等于5了,而是8了,所以,將這個(gè)結(jié)構(gòu)賦值給一個(gè)char *,里面會(huì)多出一些零...

需要解決這個(gè)問(wèn)題,可以在Project->Setting->Link->Project Options里加上/Zp1

另外,可以參考一下MSDN里/Zp的編譯選項(xiàng).....
回復(fù)人: lz_0618(lz_0618) (2001-7-31 19:43:54) 得0分
根本不是什么字節(jié)對(duì)齊的問(wèn)題,我上面的程序經(jīng)過(guò)測(cè)試都好用啊,這位老兄用我的那段程序究竟是什么錯(cuò)誤,能說(shuō)清楚點(diǎn)嗎???

我這邊用socket發(fā)送結(jié)構(gòu)是一點(diǎn)問(wèn)題也沒(méi)有啊,而且是在VC和Delphi編的程序間通訊,當(dāng)然,這時(shí)應(yīng)該注意字節(jié)對(duì)齊的問(wèn)題了,在VC程序間,
只要不是故意將服務(wù)器和客戶端的編譯環(huán)境設(shè)的不一樣,肯定是沒(méi)有什么問(wèn)題的,最多是多傳幾個(gè)Bit罷了。
回復(fù)人: kiko_lee(到處瞧瞧) (2001-8-3 11:02:51) 得0分
我發(fā)現(xiàn)將char * memcpy 到 char * 中間都有點(diǎn)問(wèn)題,但是如果放到 char []中間就可以了,大家知道為什么否?
回復(fù)人: ydogg(灰毛兔) (2001-8-3 11:40:35) 得0分
memcpy不copy最后的'\0'...
回復(fù)人: wenjunlin2000(微軟克星) (2001-8-3 14:32:17) 得0分
是你看錯(cuò)了
因?yàn)閏har*是以0 結(jié)尾的

回復(fù)人: mc_music(狂沙) (2001-8-3 15:07:21) 得0分
請(qǐng)注意我的程序:
struct ABCD *abcd;
char *buf;
abcd = (ABCD *)calloc(1,sizeof(ABCD));
//初始化abcd
buf=abcd;//指針直接符值就可以了
回復(fù)人: zhangnanonnet(WinSockZhang) (2001-8-3 16:21:03) 得0分
你試試把類型變?yōu)锽YTE
回復(fù)人: kiko_lee(到處瞧瞧) (2001-8-7 9:21:08) 得0分
不管了,給分,大家都有不少的建議呢。


38。double dou=12.34;我如何可以得到char * ch="12.34";轉(zhuǎn)換函數(shù)是什么?

回復(fù)人: wyzegg(蛋) (2001-7-24 21:26:04) 得50分
double dou=12.34;
char * ch;
ch=malloc(100);
sprintf(ch,"%5.2f",dou);
回復(fù)人: wyzegg(蛋) (2001-7-24 21:28:24) 得0分
或者
#include <stdlib.h>
#include <stdio.h>

void main( void )
{
int decimal, sign;
char *buffer;
int precision = 10;
double source = 3.1415926535;

buffer = _ecvt( source, precision, &decimal, &sign );
printf( "source: %2.10f buffer: '%s' decimal: %d sign: %d\n",
source, buffer, decimal, sign );
}

但是第一種常用
回復(fù)人: Matrix_w(學(xué)會(huì)一點(diǎn)點(diǎn)) (2001-7-24 21:32:43) 得30分
int decimal, sign;
double dou =12.34;
char* ch;
ch = _ecvt(dou,4,&decimal,&sign);

回復(fù)人: imhua(華弟) (2001-7-24 21:35:02) 得20分
double dou=12.34;
char *str;
gcvt(dou,5,str); //5是長(zhǎng)度
MessageBox(str);
回復(fù)人: Matrix_w(學(xué)會(huì)一點(diǎn)點(diǎn)) (2001-7-24 21:37:58) 得0分
/* _GCVT.C: This program converts -3.1415e5
* to its string representation.
*/

#include <stdlib.h>
#include <stdio.h>

void main( void )
{
char buffer[50];
double source = -3.1415e5;
_gcvt( source, 7, buffer );
printf( "source: %f buffer: '%s'\n", source, buffer );
_gcvt( source, 7, buffer );
printf( "source: %e buffer: '%s'\n", source, buffer );
}


Output

source: -314150.000000 buffer: '-314150.'
source: -3.141500e+005 buffer: '-314150.'

39。 我在ADO中調(diào)用一個(gè)存儲(chǔ)過(guò)程,存儲(chǔ)過(guò)程有三個(gè)輸入?yún)?shù)@useradd char(30),@username char(10),@userage char(3),現(xiàn)在要把char
*addr,char *name,char *age分別賦值給他們。??
我做了如下定義:
_ParameterPtr para1;
_variant_t var1,var2,var3;
==============================================================
var1.vt=VT_BSTR;
var1.bstrval=addr;/////(編譯錯(cuò)誤)
==============================================================
para1=m_pCommand->CreateParameter(L"useradd",adBSTR,adParamInput,30,var1);
m_pCommand->Parameters->Append(para1);
編譯結(jié)果出現(xiàn)下面錯(cuò)誤:
cannot convert from 'char *' to 'unsigned short *
不知道類型是不是選擇VT_BSTR?
回復(fù)人:tar(GPS) (2001-7-12 18:49:05) 得15分
var1.bstrval應(yīng)該指向?qū)捵址淖址?br />即unicode字符串
use _bstr_t to convert it

_bstr_t var1(addr);

 回復(fù)人:happyhackwang() (2001-7-12 20:06:48) 得5分
char *要進(jìn)行轉(zhuǎn)換成BSTR

 回復(fù)人:WhiteWaterBlueSky(瘋狂數(shù)碼) (2001-7-13 9:35:15) 得10分
SDK中是這樣的
1。先用MultiByteToWideChar把char* 轉(zhuǎn)為wchar_t*
2。再用SysAllocString把wchar_t*轉(zhuǎn)為BSTR

 回復(fù)人:tar(GPS) (2001-7-13 14:10:01) 得0分
faint,我都已經(jīng)把語(yǔ)句寫(xiě)出來(lái)了
_bstr_t a(addr);
var1.vt=VT_BSTR;
var1.bstrval=(wchar_t *)a;

 回復(fù)人:xwchena(西風(fēng)之神) (2001-7-13 15:57:00) 得0分
大哥,我改完之后記錄集無(wú)結(jié)果返回。我的代碼是這樣的:
m_pRecordset.CreateInstance(__uuidof(Recordset));
m_pRecordset=m_pCommand->Execute(NULL,NULL,adCmdStoredProc);
if(!m_pRecordset->adoEOF)
{
result1=m_pRecordset->GetCollect((long)0);
if(result1.vt!=NULL)
{
result1.ChangeType(VT_BSTR);
CString strResult1=result1.bstrVal;
strcpy(resval,strResult1);
}
調(diào)試的時(shí)候看到執(zhí)行完m_pCommand->Execute()后m_pRecordset就到了記錄集的尾部
而如果把char*型都改成int型,結(jié)果就能返回記錄集。
這是為什么啊???

 回復(fù)人:tar(GPS) (2001-7-13 19:19:51) 得0分
try adVarChar
 回復(fù)人:xwchena(西風(fēng)之神) (2001-7-13 22:54:21) 得0分
還是不行,記錄集沒(méi)有返回結(jié)果
 回復(fù)人:seesi(不是我想騙你,是我不知道怎么才能不騙!) (2001-7-14 0:24:36)

40。如何將 BSTR pVal 賦給:unsigned char *pw;如何將:unsigned char digest[16]賦給 BSTR *pOutVal?

USES_CONVERSION;
? *pOutVal=SysAllocString(A2W((LPTSTR)digest));

unsigned char *pw = (unsigned char *)_com_util::ConvertBSTRToString(pInVal);

posted on 2007-02-26 17:04 大龍 閱讀(1553) 評(píng)論(0)  編輯 收藏 引用


只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久久久久久欧美精品| 免费91麻豆精品国产自产在线观看| 一本大道av伊人久久综合| 久久se精品一区精品二区| 91久久嫩草影院一区二区| 亚洲午夜激情网站| 欧美日韩精品一区二区在线播放| 亚洲国产精品小视频| 久久漫画官网| 久久成人精品电影| 国产女精品视频网站免费 | 免费观看成人鲁鲁鲁鲁鲁视频| 亚洲素人在线| 国产精品少妇自拍| 欧美有码视频| 久久精品成人欧美大片古装| 国产一区白浆| 麻豆精品视频在线| 美女日韩欧美| 99视频精品在线| 亚洲精品中文字| 欧美亚州韩日在线看免费版国语版| 亚洲小说欧美另类社区| 一本一本久久a久久精品综合麻豆| 欧美日韩日本国产亚洲在线| 亚洲一区二区免费视频| 亚洲自拍偷拍网址| 今天的高清视频免费播放成人 | 国产精品视频专区| 久久久久久久久伊人| 红桃视频成人| 亚洲二区三区四区| 欧美系列电影免费观看| 欧美一区二区高清| 久久久人成影片一区二区三区| 亚洲国产精品成人| 99综合精品| 国产一区香蕉久久| 亚洲黄色天堂| 国产欧美在线视频| 亚洲国产mv| 国产精品热久久久久夜色精品三区 | 久久影院午夜论| 亚洲美女91| 亚洲一区国产精品| 亚洲激情视频网站| 中文日韩在线| 韩国精品久久久999| 亚洲精品日日夜夜| 国产亚洲亚洲| 亚洲乱码国产乱码精品精98午夜 | 亚洲精品久久久蜜桃| 亚洲私人影院在线观看| 亚洲第一精品影视| 亚洲综合999| 亚洲精品国产系列| 亚洲欧美久久| 在线视频中文亚洲| 久久尤物视频| 久久久久国产精品一区三寸 | 亚洲国产导航| 亚洲免费影院| 一区二区三区日韩| 久久蜜桃资源一区二区老牛| 亚洲欧美激情一区二区| 免费在线成人av| 久久国产精品99久久久久久老狼| 欧美激情91| 欧美成人在线免费观看| 国产一区二区无遮挡| 一区二区三区波多野结衣在线观看| 在线观看亚洲精品| 欧美一区二区三区免费大片| 亚洲一区二区精品在线观看| 欧美精品v国产精品v日韩精品| 久久色中文字幕| 国产精品久久久久久久久久久久 | 美女久久一区| 巨胸喷奶水www久久久免费动漫| 国产精品卡一卡二| 99天天综合性| 亚洲视频在线免费观看| 欧美激情一区二区三区全黄| 欧美成人小视频| 一本大道久久精品懂色aⅴ| 国产精品乱码一区二三区小蝌蚪 | 小黄鸭视频精品导航| 在线视频亚洲欧美| 欧美另类一区二区三区| 亚洲高清电影| 亚洲国产一区二区三区a毛片 | 国产精品久久久久av| 99国产麻豆精品| 亚洲午夜电影| 国产精品成人v| 亚洲一区二区三区精品在线| 亚洲欧美国产视频| 国产免费观看久久黄| 午夜精品福利在线| 久久成人精品| 一区在线免费观看| 你懂的网址国产 欧美| 亚洲黄色尤物视频| 亚洲最新视频在线| 国产精品久久久久久久9999| 亚洲免费影视第一页| 久久xxxx精品视频| 韩日欧美一区二区三区| 久久久蜜臀国产一区二区| 欧美成人免费播放| 日韩亚洲视频在线| 欧美午夜电影在线| 午夜欧美不卡精品aaaaa| 久久精品人人做人人爽电影蜜月| 国内精品久久久久影院色| 久久精品视频免费观看| 开心色5月久久精品| 亚洲乱码久久| 国产精品嫩草影院av蜜臀| 欧美在线影院在线视频| 欧美激情在线| 校园激情久久| 亚洲国产精品久久久久秋霞影院 | 亚洲欧洲日韩综合二区| 欧美日韩一级片在线观看| 午夜亚洲福利| 亚洲第一区色| 亚洲欧美日韩精品久久久| 国产一区二区三区久久久| 欧美国产日韩a欧美在线观看| 国产精品99久久久久久www| 久久精品成人| 亚洲视频欧美在线| 精品盗摄一区二区三区| 欧美日韩一区二区免费在线观看| 亚洲欧美日韩精品久久久| 欧美激情视频一区二区三区在线播放| 中文成人激情娱乐网| 黄色日韩网站视频| 国产精品v欧美精品∨日韩| 久久全球大尺度高清视频| 亚洲一品av免费观看| 欧美激情免费观看| 欧美在线高清| 一区二区三区精密机械公司| 韩国视频理论视频久久| 欧美日韩亚洲网| 麻豆国产精品va在线观看不卡| 洋洋av久久久久久久一区| 欧美成人精品1314www| 亚洲黄色免费网站| 久久精品免费播放| 亚洲影视在线| 日韩视频不卡中文| 亚洲第一伊人| 久久综合99re88久久爱| 欧美亚洲专区| 亚洲女女女同性video| 亚洲精品小视频在线观看| 国模套图日韩精品一区二区| 欧美日韩不卡视频| 欧美成人第一页| 鲁大师影院一区二区三区| 性欧美激情精品| 亚洲欧美另类在线观看| 亚洲区一区二| 亚洲国产美女| 亚洲成在人线av| 亚洲午夜久久久| 欧美国产一区二区| 免费日韩av片| 麻豆国产精品一区二区三区 | 欧美一区中文字幕| 亚洲欧美激情视频在线观看一区二区三区| 日韩视频在线一区二区| 亚洲精品久久久久久下一站| 91久久精品美女高潮| 在线看片第一页欧美| 狠狠v欧美v日韩v亚洲ⅴ| 国产在线观看一区| 狠狠操狠狠色综合网| 精品成人乱色一区二区| 在线免费观看成人网| 亚洲国产精品尤物yw在线观看 | 欧美激情亚洲视频| 欧美大片一区| 91久久国产综合久久蜜月精品 | 中文精品视频| 亚洲影视综合| 欧美一区二区三区视频| 久久精品综合一区| 久久亚洲精品伦理| 欧美激情中文不卡| 欧美三级电影大全| 国产精品视频久久一区| 国产一区二区三区在线免费观看| 在线观看欧美亚洲| 99在线精品视频| 性色一区二区| 老鸭窝毛片一区二区三区|