博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
VC中常用类型转换2
阅读量:4232 次
发布时间:2019-05-26

本文共 42183 字,大约阅读时间需要 140 分钟。

所有方法都做测试,仅仅是为了给大家一个参考。
读者层次:初学
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;
一、其它数据类型转换为字符串
  • 短整型(int)
    itoa(i,temp,10);///
    i转换为字符串放入temp,最后一个数字表示十进制
    itoa(i,temp,2); ///
    按二进制方式转换
  • 长整型(long)
    ltoa(l,temp,10);
  • 浮点数(float,double)
    fcvt可以完成转换,这是MSDN中的例子:
    int decimal, sign;
    char *buffer;
    double source = 3.1415926535;
    buffer = _fcvt( source, 7, &decimal, &sign );
    运行结果:source: 3.1415926535 buffer: '31415927' decimal: 1 sign: 0
    decimal
    表示小数点的位置,sign表示符号:0为正数,1为负数
  • CString变量
    str = "2008
    北京奥运";
    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
    类型是对BSTR的封装,因为已经重载了=操作符,所以很容易使用
    _bstr_t bstrVar("test");
    const char *buf = bstrVar;///
    不要修改buf中的内容
    AfxMessageBox(buf);
  • 通用方法(针对非COM数据类型)
    sprintf完成转换
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);
二、字符串转换为其它数据类型
strcpy(temp,"123");
  • 短整型(int)
    i = atoi(temp);
  • 长整型(long)
    l = atol(temp);
  • 浮点(double)
    d = atof(temp);
  • CString变量
    CString name = temp;
  • BSTR变量
    BSTR bstrValue = ::SysAllocString(L"
    程序员");
    ...///
    完成对bstrValue的使用
    SysFreeString(bstrValue);
  • CComBSTR变量
    CComBSTR
    类型变量可以直接赋值
    CComBSTR bstrVar1("test");
    CComBSTR bstrVar2(temp);
  • _bstr_t变量
    _bstr_t
    类型的变量可以直接赋值
    _bstr_t bstrVar1("test");
    _bstr_t bstrVar2(temp);
三、其它数据类型转换到
CString
使用
CString
的成员函数
Format
来转换
,
例如
:
  • 整数(int)
    str.Format("%d",i);
  • 浮点数(float)
    str.Format("%f",i);
  • 字符串指针(char *)等已经被CString构造函数支持的数据类型可以直接赋值
    str = username;
  • 对于Format所不支持的数据类型,可以通过上面所说的关于其它数据类型转化到char *的方法先转到char *,然后赋值给CString变量。
四、
BSTR
_bstr_t
CComBSTR
  • CComBSTR ATLBSTR的封装,_bstr_tC++BSTR的封装,BSTR32位指针,但并不直接指向字串的缓冲区。
    char *
    转换到BSTR可以这样:
    BSTR b=_com_util::ConvertStringToBSTR("
    数据");///使用前需要加上comutil.hcomsupp.lib
    SysFreeString(bstrValue);
    反之可以使用
    char *p=_com_util::ConvertBSTRToString(b);
    delete p;
    具体可以参考一,二段落里的具体说明。
    CComBSTR
    _bstr_t对大量的操作符进行了重载,可以直接进行=,!=,==等操作,所以使用非常方便。
    特别是_bstr_t,建议大家使用它。
五、
VARIANT
_variant_t
COleVariant
  • VARIANT的结构可以参考头文件VC98/Include/OAIDL.H中关于结构体tagVARIANT的定义。
    对于VARIANT变量的赋值:首先给vt成员赋值,指明数据类型,再对联合结构中相同数据类型的变量赋值,举个例子:
    VARIANT va;
    int a=2001;
    va.vt=VT_I4;///
    指明整型数据
    va.lVal=a; ///
    赋值
    对于不马上赋值的VARIANT,最好先用Void VariantInit(VARIANTARG FAR* pvarg);进行初始化,其本质是将vt设置为VT_EMPTY,下表我们列举vt与常用数据的对应关系:
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_tVARIANT的封装类,其赋值可以使用强制类型转换,其构造函数会自动处理这些数据类型。
    使用时需加上#include <comdef.h>
    例如:
    long l=222;
    ing i=100;
    _variant_t lVal(l);
    lVal = (long)i;
  • COleVariant的使用与_variant_t的方法基本一样,请参考如下例子:
    COleVariant v3 = "
    字符串", v4 = (long)1999;
    CString str =(BSTR)v3.pbstrVal;
    long i = v4.lVal;
六、其它一些
COM
数据类型
  • 根据ProgID得到CLSID
    HRESULT CLSIDFromProgID( LPCOLESTR lpszProgID,LPCLSID pclsid);
    CLSID clsid;
    CLSIDFromProgID( L"MAPI.Folder",&clsid);
  • 根据CLSID得到ProgID
    WINOLEAPI ProgIDFromCLSID( REFCLSID clsid,LPOLESTR * lplpszProgID);
    例如我们已经定义了 CLSID_IApplication,下面的代码得到ProgID
    LPOLESTR pProgID = 0;
    ProgIDFromCLSID( CLSID_IApplication,&pProgID);
    ...///
    可以使用pProgID
    CoTaskMemFree(pProgID);//
    不要忘记释放
七、
ANSI
Unicode
Unicode
称为宽字符型字串
,COM
里使用的都是
Unicode
字符串。
  • ANSI转换到Unicode
    (1)
    通过L这个宏来实现,例如: CLSIDFromProgID( L"MAPI.Folder",&clsid);
    (2)
    通过MultiByteToWideChar函数实现转换,例如:
    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)
    通过A2W宏来实现,例如:
    USES_CONVERSION;
    CLSIDFromProgID( A2W(szProgID),&clsid);
  • Unicode转换到ANSI
    (1)
    使用WideCharToMultiByte,例如:
    //
    假设已经有了一个Unicode wszSomeString...
    char szANSIString [MAX_PATH];
    WideCharToMultiByte ( CP_ACP, WC_COMPOSITECHECK, wszSomeString, -1, szANSIString, sizeof(szANSIString), NULL, NULL );
    (2)
    使用W2A宏来实现,例如:
    USES_CONVERSION;
    pTemp=W2A(wszSomeString);
八、其它
  • 对消息的处理中我们经常需要将WPARAMLPARAM32位数据(DWORD)分解成两个16位数据(WORD),例如:
    LPARAM lParam;
    WORD loValue = LOWORD(lParam);///
    取低16
    WORD hiValue = HIWORD(lParam);///
    取高16
  • 对于16位的数据(WORD)我们可以用同样的方法分解成高低两个8位数据(BYTE),例如:
    WORD wValue;
    BYTE loValue = LOBYTE(wValue);///
    取低8
    BYTE hiValue = HIBYTE(wValue);///
    取高8
  • 两个16位数据(WORD)合成32位数据(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 );
  • 两个8位的数据(BYTE)合成16位的数据(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三个颜色值
    BYTE Red = GetRValue(bkcolor); ///
    得到红颜色
    BYTE Green = GetGValue(bkcolor); ///
    得到绿颜色
    BYTE Blue = GetBValue(bkcolor); ///
    得到兰颜色
九、注意事项
假如需要使用到
ConvertBSTRToString
此类函数
,
需要加上头文件
comutil.h,
并在
setting
中加入
comsupp.lib
或者直接加上
#pragma comment( lib, "comsupp.lib" )
后记:本文匆匆写成,错误之处在所难免,欢迎指正
.
关于把
BSTR
类型数据转换成
CString
类型数据时的问题
?
当我在把
BSTR
类型数据转换成
CString
“char*
类型
数据时,发现在
BSTR
类型字符串较短的情况下没问题,当较长时就会出现
内存读写错了。(在
NT
2000
下都测试是这样的。)
根据你所说:
1
)字符串指针
(char *)
等已经被
CString
构造函数支持的数据类型
可以直接赋值
str = username;
2
)当
b
BSTR
类型时可以使用
char *p=_com_util::ConvertBSTRToString(b);
于是以下是对的:
CString cstr;
BSTR bstr;
....
cstr=com_util::ConvertBSTRToString(bstr);
...
可是当
bstr
非常大时(其实,较大时就会)就会出现内存读写错,不知何故。
此外我发现
cstr=com_util::ConvertBSTRToString(bstr);
可以简化为
cstr=bstr;
但当
bstr
较大时同样出现这个问题。
请兄弟帮忙!急。谢谢!
如何转化
((list*)fileip.bian)->liang
关于把
CString
转化成
LPCTSTR
的问题
作者
:jakiesun
发表日期
:2001-9-5 20:08:48
我记的我以前写过这样一段代码
void function()
{
CString str,str1,str2;
function((char*)(LPCTSTR)str1);
str=str1;
...//
调试道此发现
str2
的值随着
str
的改变而改变,请问能解释一下为什么,如有回答,请通知
wangshaohong@sohu.com,tx
}
添加
lib
支持
作者
:
磨刀霍霍
发表日期
:2001-9-10 11:32:12
如果不添加会产生错误,在
setting
中加入
comsupp.lib
或者直接
#pragma comment( lib, "comsupp.lib" )
微软认为缺省的设置
call convention
如果不设置成
__cdecl
也会出现同样的错误。
1
int
转成
cstring
??
回复人: 
caigzhi(caigzhi)
 
(2001-10-17 11:27:35)
0
 
CString
的成员函数
Format()
int a = 2131;
CString str;
str.Format("%d",a);
回复人: 
tenchi(C
C++
之间
)
 
(2001-10-17 11:32:12)
0
 
int i=2001;
char str[10];
_itoa(i,str,10);
CString szString=str; 
回复人: 
fiolin(
幽深的水
)
 
(2001-10-17 11:45:40)
0
 
他们两个的都可以!!
 
回复人: 
sohucsdnvc(thanks)
 
(2001-10-17 13:24:17)
0
 
那如何把
double
转成
cstring 
回复人: 
yihugang(
小虎子
)
 
(2001-10-17 13:29:15)
6
 
int i = 2131;
char *c=new char[20];
CString str;
sprintf(c,'%d',i);
str=*c;
回复人: 
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.'
回复人: 
Gu_c_h(Gu)
 
(2001-10-17 14:49:56)
6
 
int a = -3.1415e5;
CString str;
str.Format("%f",a); 
回复人: 
ruixp(
锐剑
)
 
(2001-10-17 15:06:48)
6
 
CString
的成员函数
Format()
int a = 2131;
CString str;
str.Format("%d",a);
2
。基类对象怎么能转换成派生类对象?
int CDaoListView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
lpCreateStruct->style |= LVS_REPORT |LVS_EDITLABELS;
if (CListView::OnCreate(lpCreateStruct) == -1)
return -1;
创建
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
定义!
{
...
}
注:我的问题是
GetListCtrl()
返回的是一个
cListCtrl
对象的引用
,
怎么能把它转换成一个它的派生类对象的引用?
c++
的类型转换怎么支持?
 
回复贴子:
 
回复人: 
lhj(
努力加油
)
 
(2002-1-29 18:56:06)
0
 
CListCtrlEx& ctlList = (CListCtrlEx&) GetListCtrl();
这是强制类型转换,
&
表示是一个引用,
lctList
的值在这次赋值后不能被修改。
回复人: 
wwwsq(wwwsq)
 
(2002-1-29 19:09:22)
0
 
建议你找本
C++
方面的书看看,
VC
虽然号称可视,实际上
C++
基础还是很重要的。
回复人: 
xcopy(xcopy)
 
(2002-1-29 19:26:16)
0
 
dynamic_cast()
可以安全的转换。
 
3
。如何在
CString
double
之间转换?要求转换之后能保留小数点,保留正负号??
cstring::format(%.xe) x
为精度位
 
回复人: 
pchaos(
杂讲
)
 
(2002-1-28 11:21:46)
0
 
CString str;
double db;
str = "123.456";
db = atof((LPCTSTR)str); 
回复人: 
hgw111(hg)
 
(2002-1-28 11:52:57)
0
 
CString -> double : atof
double ->CString :Format 
回复人: 
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
。字符型要转换成
int
??
atoi(str) 
5
_bstr_t
unsigned int
??
_bstr_t str;
unsigned int Length=6;
Length=Length-str.length(); 
6
VARIANT
类型转换问题?
我在使用
MSCOMM
SetOutput()
函数时
形参必须为
VARIANT
变量
如何将其它的数据类型转换为
VARIANT
类型?
如:
Cstring->VARIANT
*char->VARIANT
我对
VARIANT
的类型结构体不太熟,请讲详细些(最好有范例),谢谢!
回复贴子:
 
回复人: 
vc_xiaoxin(
小新
)
 
(2001-12-26 15:43:57)
0
 
VARIANT
本身是一个复杂的结构,别的数据怎么转呀?关注
 
回复人: 
mpg_liu(
星仁
)
 
(2001-12-27 18:33:50)
10
 
定义一个
VARIANT
变量后,他应该是一个结构体变量,其中有一个成员是字符型的,给这个成员赋值
 
回复人: 
LLnju(LLnju)
 
(2001-12-27 18:36:10)
0
 
实在不清楚嘛就用
_variant_t , COleVariant
这些东东嘛,很好用的啊
 
回复人: 
softarts(CDMA2000)
 
(2001-12-27 18:41:32)
10
 
构造一个就行了。
VARIANT varXX;
CString strYY;
varXX.vt=VT_BSTR;
varXX.bstrVal = strYY.allocsysstring();
应该可以了。
回复人: 
softarts(CDMA2000)
 
(2001-12-27 18:42:11)
0
 
我也觉得
COleVariant
要好用一些,呵呵,我都用它。
 
回复人: 
bobofu(
有问题要问
)
 
(2001-12-27 19:32:18)
10
 
CString str;
_variant_t var;
var = _variant_t(str); 
7
COleVarant
如何转换为
CString?
CString
如何转换为
char *
CString
如何转换为
char[xx]
??
CString
如何转换为
char * wsprintf
或者=
CString
如何转换为
char[xx] strcpy
()
 
回复人: 
SecretGarden(
天堂鸟
)
 
(2002-1-14 11:55:23)
0
 
COleVarant
封装了
VAREANT
类型。
VAREANT
类型其实是个巨大地
Union
,里面自然有你
想要地
unsigned char *
类型。
CString
GetBuffer
Format
可以实现你的后两个问题
8
v_variant_t
类型转换成
cstring
总提示我
cstring
未定义
程序如下
_variant_t vfirstname;//
存储的是数据库中的数据
CString str;//
提示出错
vfirstname=pRs->GetCollect (_variant_t("Phone_Num"));
vfirstname.ChangeType (VT_BSTR);
str=vfirstname.bstrVal;//
提示出错
 
回复贴子:
 
回复人: 
hydnoahark(
诺亚方舟
)
 
(2001-11-12 11:56:51)
10
 
>>CString str;//
提示出错
要求
include <afx.h>
并且设置
Use run-time Library
Multithreaded 
回复人: 
zhengyun_ustc(^-^)
 
(2001-11-12 12:04:39)
15
 
CString
未定义,说明你的工程没有引用
MFC
!!
要想使你的工程支持
MFC
,请按照以下步骤作:
1
:在你的
stdafx.h
的头文件中加入:
#include "afxtempl.h"
这是一个囊括了
MFC
的集合定义的头文件,有了它,你的工程就识别
Cstring
类了。
2
:在你的工程设置中,在
General
页中,选择
“MFC”
“Using MFC in a shared DLL”
OK
,现在再编译你的工程即可。
 
回复人: 
zhengyun_ustc(^-^)
 
(2001-11-12 12:06:56)
5
 
_variant_t
bstrVal
成员是
BSTR
类型。
它是一个指向一个
OLECHART*
的指针。
 
回复人: 
vickowang(
小苍
)
 
(2001-11-12 12:48:21)
5
 
(char *)_bstr_t(vfirstname) 
回复人: 
smallfool(smallfool)
 
(2001-11-12 13:52:54)
4
 
或许你还需要一个从
UNICODE
字符到
ANSI
字符的转变函数
 
回复人: 
sun_1112(
)
 
(2001-11-12 17:34:44)
0
 
谢谢大家
给我这么大的支持!:)
 
回复人: 
zhengyun_ustc(^-^)
 
(2001-11-14 13:24:07)
0
 
vickowang(
小苍
)
的意见可能会有问题,转换出的字符串应该是乱码。
因为
(char *)
转换需要一个
const
的字符串资源,才能强制转换。
所以应该:
_bstr_t bstrTemp = _bstr_t(vfirstname.bstrVal);
TCHAR szTemp[MAX_PATH];
szTemp = (char*)bstrTemp;
9
char *
转换为
TCHAR
类型??
直接转换
,TCHAR
相当于
char
char * s;
TCHAR * s1=(TCHAR *)s; 
回复人: 
dysxq()
 
(2001-12-21 21:26:25)
0
 
要看你的程序设置是
ANSI
还是
UNICODE,
如果是
ANSI,
直接转
,
如果是
UNICODE,TCHAR
相当于
WCHAR,
要用
mbstowcsz
转一下
 
回复人: 
xiaoxiaohan(
萧晓寒
)
 
(2001-12-21 23:52:17)
0
 
Unicode
:宽字节字符集
1.
如何取得一个既包含单字节字符又包含双字节字符的字符串的字符个数?
可以调用
Microsoft Visual C++
的运行期库包含函数
_mbslen
来操作多字节(既包括单字节也包括双字节)字符串。
调用
strlen
函数,无法真正了解字符串中究竟有多少字符,它只能告诉你到达结尾的
0
之前有多少个字节。
2.
如何对
DBCS
(双字节字符集)字符串进行操作?
函数
描述
PTSTR CharNext
LPCTSTR
;
返回字符串中下一个字符的地址
PTSTR CharPrev
LPCTSTR, LPCTSTR
);
返回字符串中上一个字符的地址
BOOL IsDBCSLeadByte( BYTE )
如果该字节是
DBCS
字符的第一个字节,则返回非
0
3.
为什么要使用
Unicode
1
可以很容易地在不同语言之间进行数据交换。
2
使你能够分配支持所有语言的单个二进制
.exe
文件或
DLL
文件。
3
提高应用程序的运行效率。
Windows 2000
是使用
Unicode
从头进行开发的,如果调用任何一个
Windows
函数并给它传递一个
ANSI
字符串,那么系统首先要将字符串转换成
Unicode
,然后将
Unicode
字符串传递给操作系统。如果希望函数返回
ANSI
字符串,系统就会首先将
Unicode
字符串转换成
ANSI
字符串,然后将结
果返回给你的应用程序。进行这些字符串的转换需要占用系统的时间和内存。通过从头开始用
Unicode
来开发应用程序,就能够使你的应用程序
更加有效地运行。
Windows CE
本身就是使用
Unicode
的一种操作系统,完全不支持
ANSI Windows
函数
Windows 98
只支持
ANSI
,只能为
ANSI
开发应用程序。
Microsoft
公司将
COM
16
Windows
转换成
Win32
时,公司决定需要字符串的所有
COM
接口方法都只能接受
Unicode
字符串。
4.
如何编写
Unicode
源代码?
Microsoft
公司为
Unicode
设计了
WindowsAPI
,这样,可以尽量减少代码的影响。实际上,可以编写单个源代码文件,以便使用或者不使用
Unicode
来对它进行编译。只需要定义两个宏(
UNICODE
_UNICODE
),就可以修改然后重新编译该源文件。
_UNICODE
宏用于
C
运行期头文件,而
UNICODE
宏则用于
Windows
头文件。当编译源代码模块时,通常必须同时定义这两个宏。
5. Windows
定义的
Unicode
数据类型有哪些?
数据类型
说明
WCHAR Unicode
字符
PWSTR
指向
Unicode
字符串的指针
PCWSTR
指向一个恒定的
Unicode
字符串的指针
对应的
ANSI
数据类型为
CHAR
LPSTR
LPCSTR
ANSI/Unicode
通用数据类型为
TCHAR
PTSTR,LPCTSTR
6.
如何对
Unicode
进行操作?
字符集
特性
实例
ANSI
操作函数以
str
开头
strcpy
Unicode
操作函数以
wcs
开头
wcscpy
MBCS
操作函数以
_mbs
开头
_mbscpy
ANSI/Unicode
操作函数以
_tcs
开头
_tcscpy
C
运行期库)
ANSI/Unicode
操作函数以
lstr
开头
lstrcpy
Windows
函数)
所有新的和未过时的函数在
Windows2000
中都同时拥有
ANSI
Unicode
两个版本。
ANSI
版本函数结尾以
A
表示;
Unicode
版本函数结尾以
W
表示。
Windows
会如下定义:
#ifdef UNICODE
#define CreateWindowEx CreateWindowExW
#else
#define CreateWindowEx CreateWindowExA
#endif // !UNICODE
7.
如何表示
Unicode
字符串常量?
字符集
实例
ANSI “string”
Unicode L“string”
ANSI/Unicode T(“string”)
_TEXT(“string”)if( szError[0] == _TEXT(‘J’) ){ }
8.
为什么应当尽量使用操作系统函数?
这将有助于稍稍提高应用程序的运行性能,因为操作系统字符串函数常常被大型应用程序比如操作系统的外壳进程
Explorer.exe
所使用。由于
这些函数使用得很多,因此,在应用程序运行时,它们可能已经被装入
RAM
如:
StrCat
StrChr
StrCmp
StrCpy
等。
9.
如何编写符合
ANSI
Unicode
的应用程序?
1
将文本串视为字符数组,而不是
chars
数组或字节数组。
2
将通用数据类型(如
TCHAR
PTSTR
)用于文本字符和字符串。
3
将显式数据类型(如
BYTE
PBYTE
)用于字节、字节指针和数据缓存。
4
TEXT
宏用于原义字符和字符串。
5
执行全局性替换(例如用
PTSTR
替换
PSTR
)。
6
修改字符串运算问题。例如函数通常希望在字符中传递一个缓存的大小,而不是字节。这意味着不应该传递
sizeof(szBuffer),
而应该传
递(
sizeof(szBuffer)/sizeof(TCHAR)
。另外,如果需要为字符串分配一个内存块,并且拥有该字符串中的字符数目,那么请记住要按字节来
分配内存。这就是说,应该调用
malloc(nCharacters *sizeof(TCHAR)),
而不是调用
malloc(nCharacters)
10.
如何对字符串进行有选择的比较?
通过调用
CompareString
来实现。
标志
含义
NORM_IGNORECASE
忽略字母的大小写
NORM_IGNOREKANATYPE
不区分平假名与片假名字符
NORM_IGNORENONSPACE
忽略无间隔字符
NORM_IGNORESYMBOLS
忽略符号
NORM_IGNOREWIDTH
不区分单字节字符与作为双字节字符的同一个字符
SORT_STRINGSORT
将标点符号作为普通符号来处理
11.
如何判断一个文本文件是
ANSI
还是
Unicode
判断如果文本文件的开头两个字节是
0xFF
0xFE
,那么就是
Unicode
,否则是
ANSI
12.
如何判断一段字符串是
ANSI
还是
Unicode
IsTextUnicode
进行判断。
IsTextUnicode
使用一系列统计方法和定性方法,以便猜测缓存的内容。由于这不是一种确切的科学方法,因此
 
IsTextUnicode
有可能返回不正确的结果。
13.
如何在
Unicode
ANSI
之间转换字符串?
Windows
函数
MultiByteToWideChar
用于将多字节字符串转换成宽字符串;函数
WideCharToMultiByte
将宽字符串转换成等价的多字节字符串。
回复人: 
xtky_limi(
痛在心中笑在脸上
)
 
(2001-12-22 0:35:58)
0
 
上面说的已经比较全了。
 
回复人: 
xtky_limi(
痛在心中笑在脸上
)
 
(2001-12-22 0:38:13)
0
 
TEXT
是宏
相当于
L##
它可以根据编译环境确定为
DBMS,
还是
UNICODE
字符集
10
int
类型转换为
CString
类型?
回复人: 
tjmxf(
天涯
)
 
(2001-12-17 19:59:34)
0
 
itoa() 
回复人: 
zf925(
天下哪来那么多高手
)
 
(2001-12-17 20:00:30)
22
 
char m[20];
str=str + itoa(i,m,10); 
回复人: 
yuezifeng(wybzd)
 
(2001-12-17 20:00:50)
22
 
CString str;
str.Format("%d",i);
回复人: 
kingfish(
今飞
)
 
(2001-12-17 20:06:27)
0
 
str.Format("%s%d",str,i); 
回复人: 
tanyajun(
谈子
)
 
(2001-12-17 20:09:25)
0
 
CString str="test";
int i=11;
CString str1;
str1.Format("%d",i);
str = str+str1;
回复人: 
guanjinke(
纶巾客
)
 
(2001-12-17 20:10:42)
0
 
int i=11;
CString str="test";
CString addition;
addition.Format("%d",i);
str+=addition;
就可以了。
 
11
。关于
sprintf
类型转换的问题
sprintf(buf,"select price from ls01 where p_date>='%'",t_date)
其中
t_date
CTime
类型,
%
后面应该是什么呢?
%s
String
类型
,%c
char,
那么
CTime
型对应的是什么呢?
 
 
回复人: 
yakai(
日落长河
)
 
(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 
回复人: 
loh(
乐啸天涯
)
 
(2001-12-17 17:52:57)
0
 
wait
don't know 
回复人: 
masterz()
 
(2001-12-17 20:21:05)
0
 
SQL
语句中日期要写成字符串
"yyyymmdd" 
12
。类型转换
unsigned int <==>CString??
回复次数:
8
发表时间:
2001-12-17 10:25:23
unsigned int f;//unsigned int 0~4294967295
CString g;
f=2300000000;
g.Format("%d",f);
AfxMessageBox(g);
出错。 
回复人: 
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
,需要窗口的句炳参数
回复人: 
asdmusic8(asdmusic8)
 
(2001-12-17 10:35:15)
0
 
AfxMessageBox(g);
MessageBox(g);
都不错。
错的是
g.
2300000000=
1994967296
回复人: 
asdmusic8(asdmusic8)
 
(2001-12-17 10:36:10)
0
 
2300000000=
-1994967296
类型转换错。
回复人: 
ydogg(
灰毛兔频频
)
 
(2001-12-17 10:37:54)
6
 
g.Format("%u",f);
回复人: 
asdmusic8(asdmusic8)
 
(2001-12-17 10:40:24)
0
 
to dgsnmpoperate
那怎么从
CString ==>>unsigned int 
回复人: 
kingfish(
今飞
)
 
(2001-12-17 10:42:10)
6
 
既然是
unsigned int,
超过
0x7f000000 (2130706432)
当然不能用
%d (signed int)
%u 
回复人: 
kingfish(
今飞
)
 
(2001-12-17 10:44:57)
8
 
CString ==>>unsigned int 
char *p = (LPSTR)(LPCSTR) g;
f = atoi(p); 
13
static_cast
dynamic_cast
和直接类型转换(如
(void *)p
)的区别
?
发表时间:
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 
...
}
我已经知道
static_cast
dynamic_cast
的作用,但
MSDN
中并没有提到这两个操作符与直接类型转换如
void f(D* pd)
{
C* pc =
C*
(pd);
B* pb =
B*
(pd); 
...
}
的不同啊。不知道那位知道的告诉一声,在此不胜感谢,
50
分奉上。
回复贴子:
ysdesigned(
清泉
)
 
(2001-12-14 10:03:07)
0
 
static_cast
dynamic_cast
化,
义。
使
号,
 
们可以
dynamic_cast
用于多态类型的转换
static_cast
用于非多态类型的转换
回复人: 
masterz()
 
(2001-12-14 10:05:48)
0
 
static_cast<...>compile
时能发现不正确的指针类型转换
dynamic_cast<...>
运行时如果发现是不正确的指针类型转换会返回
NULL
(void*)
强制转换,如果是不正确的指针类型转换,没有办法检查,不如上面
2
中安全
 
回复人: 
meady()
 
(2001-12-14 11:29:05)
0
 
类型安全
 
回复人: 
bluecrest(
为什么我的
VC
还是那么的菜
)
 
(2001-12-14 11:45:34)
0
 
com
技术内幕介绍过
我刚看完就忘了
 
14
byte
数据类型转换成
int
??
我用
byte
型读进一组数据想把他转成
int
型进行运算如何做呢
?
如果再把
int
型转回
byte
又怎么实现呢
回复人: 
louifox(
兰陵笑笑生
)
 
(2001-12-6 9:18:38)
0
 
用下面这些宏:
WORD MAKEWORD(
BYTE bLow, 
BYTE bHigh 
);
BYTE LOBYTE(
WORD wValue 
);
BYTE HIBYTE(
WORD wValue 
);
回复人: 
chskim(
大刀阔斧
)
 
(2001-12-6 9:21:04)
0
 
int i;
BYTE b;
b=128;
i=(int)b;
回复人: 
nannet(
似的
)
 
(2001-12-6 9:38:24)
0
 
这个宏怎么用呀
?
有没有简单一点儿的,我现在能把
BYTE
转成
INT
型了,再转回去直接赋值可以吗?
 
回复人: 
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);
回复人: 
nannet(
似的
)
 
(2001-12-6 9:54:55)
0
 
问题解决了,多谢各位
 
15
。类型转换的问题,
unsigned int --> lptstr/lpctstr??
发表时间:
2001-8-7 23:49:41
如果强制转换的话,会出现致命错误,有什么好的办法呢?
能列举一些其他的办法吗?
谢谢大虾!
 
回复人: 
AlphaOne(
总是第一个倒下
)
 
(2001-8-8 0:02:43)
5
 
你为什么要强行转换呢?
如果你是要把
int
的值作为
lptstr/lpctstr
的内容的话,
可以用
CString:
unsigned int a = 100;
LPCTSTR lpText;
CString str;
str.Format("%d",a);
lpText = (LPCTSTR)str;
回复人: 
tryibest(
编の魂
)
 
(2001-8-8 8:20:20)
5
 
wsprintf(str,"%u",ui); 
回复人: 
zzh()
 
(2001-8-8 9:04:39)
5
 
这种情况不需要进行强制转换,直接使用
wsprintf
就可以了。
 
回复人: 
GJA106(
中文字符
)
 
(2001-8-8 10:10:51)
5
 
unsigned int m_na=22;
LPTSTR lptstr;
wsprintf(lptstr,"%u",m_na);
16
。关于
COM
类型转换问题
??
我定义了两个变量,一个是
void *piaRef=new unsigned char[1000];
另一个是
m_Temp=new CComVariant();
我的问题是如何将
piaRef
中的值
COPY
m_Temp
中。
 
回复人: 
nichang()
 
(2001-11-21 15:34:04)
0
 
CComBSTR bsRef=piaRef;
m_Temp=bsRef.copy() 
回复人: 
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 *' 
回复人: 
nichang()
 
(2001-11-21 17:14:28)
0
 
void*
改为
unsigned char * 
回复人: 
VincentChin(
瘟神
)
 
(2001-11-21 17:22:22)
0
 
我用
CComBSTR bsRef=(unsigned char*)piaRef
,也不行吗?
 
回复人: 
VincentChin(
瘟神
)
 
(2001-11-21 17:28:06)
0
 
会报错:
error C2440: 'type cast' : cannot convert from 'unsigned char *' to 'class ATL::CComBSTR' 
回复人: 
nichang()
 
(2001-11-22 9:12:14)
0
 
m_Temp=::SysAllocString((OLECHAR *)piaRef) 
回复人: 
VincentChin(
瘟神
)
 
(2001-11-22 10:43:07)
0
 
//error C2440: '=' : cannot convert from 'unsigned short *' to 'class ATL::CComVariant *' 
回复人: 
VincentChin(
瘟神
)
 
(2001-11-22 11:22:35)
0
 
m_Temp=new CComVariant(::SysAllocString(OLECHAR *)piaRef));
没有出错,但是我的
m_Temp
COM
组件中的一个
PROPERTY
,我想返回的是
unsigned char
类型(单字节),但经过上述转换后,就不再是单字节了呀!怎么办?
 
回复人: 
jiangsheng(
蒋晟
)
 
(2001-11-22 11:36:58)
0
 
把这个属性的类型改成
BSTR 
回复人: 
GrayWhite(
灰白
)
 
(2001-11-22 12:01:09)
0
 
m_Temp = new CComVariant((char*) piaRef);
就可以了。
VB
就是用的
BSTR,
你要给谁用阿?
VC
不用
VARIANT
的。
 
回复人: 
GrayWhite(
灰白
)
 
(2001-11-22 12:18:18)
19
 
哦,我明白了,你要各字节数组:
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); 
回复人: 
VincentChin(
瘟神
)
 
(2001-11-22 14:21:08)
0
 
SafeArrayPutElement(psa, &i, piaRef + i)
//error C2036: 'void *' : unknown size 
回复人: 
VincentChin(
瘟神
)
 
(2001-11-22 14:46:05)
0
 
To GrayWhite:
为什么要
for(long i=0;i<2;i++)? 
回复人: 
nichang()
 
(2001-11-22 15:16:35)
0
 
到底你想怎样转换嘛,是将数组内的值拷贝到
CComVariant
中存为字符串吗
回复人: 
VincentChin(
瘟神
)
 
(2001-11-22 15:28:35)
0
 
我是想把
piaRef
中的值照原样返回给其它程序使用。我正在做的是一个
COM
组件。谢谢各位!
 
回复人: 
nichang()
 
(2001-11-22 15:34:40)
10
 
unsigned char *s=new unsigned char[1000];
strcpy((char*)s,"1234");//
可以用你自己方法设置
s
中的值。
BSTR bstrS;
oleS=A2WBSTR((char*)s);//
char*
转换成
BSTR
类型
CComVariant comVT;
comVT=oleS;//
BSTR
转成
CComVariant,
这里一步也可,
comVT=A2WBSTR((char*)s);
回复人: 
VincentChin(
瘟神
)
 
(2001-11-22 16:54:07)
0
 
谢谢你!
但我还有一个问题,就是如果在
s
中有
'/0'
之类的东西我该怎么返回呢?
char *
遇到
'/0'
会认为到头了。完整的设计是这样的,我定义一个
void *
用来从一个外部设备获取数据,该数据应该是
unsigned char
,我想把这个返回的数据作为属性传出,让其它应用使用(如
VB
)。
 
回复人: 
nichang()
 
(2001-11-22 17:18:09)
0
 
'/0'
转换成其它如
'/1'
OK
了,
 
回复人: 
jiangsheng(
蒋晟
)
 
(2001-11-22 18:07:16)
0
 
用字符串数组
 
回复人: 
VincentChin(
瘟神
)
 
(2001-11-23 15:54:39)
0
 
谢谢各位的回复!我的问题解决了!如下:
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
。类型转换
static_cast reinterprete_cast
的区别
??
static_cast reinterprete_cast
的区别
 
回复人: 
tar(GPS)
 
(2001-11-21 10:06:41)
0
 
static_cast
会检查转换类型健的相关性
如果没有的画会有编译错误
reinterprete_cast
就是硬转了
 
回复人: 
tigerwoods(tao)
 
(2001-11-21 12:28:19)
0
 
是否可以这样理解:在多重继承中,
static_cast
可实现对象指针的移动,从而指向正确的父类对象部分,而
reinterprete_cast
不作偏移?
 
回复人: 
liu_feng_fly(
我恨死驱动程序了,哎,就是为了混口饭吃
)
 
(2001-11-21 12:35:14)
0
 
在多重继承中可以用
dynamic_cast
 
18
。那如何取得
CString
中的字符串??
回复人: 
nichang()
 
(2001-11-5 17:06:00)
0
 
=(LPCTSTR)CString
变量
 
回复人: 
snake1122(
领悟
)
 
(2001-11-5 17:12:16)
0
 
方法太多了
:
GetAt,Left,Mid,Right
等等,就看你怎么取了!
 
回复人: 
dusb(
保时捷
)
 
(2001-11-5 17:34:29)
0
 
可是不管是
GetAt
Left
Mid
Right
返回类型都是
CString
,还是不能用,我是要取其中的字符串,奇怪的是,
VC
中没有
string
类型。(我要的字符串是给树型控件中的分支名称)
 
回复人: 
Alps_lou(
云飞扬
)
 
(2001-11-5 17:41:36)
0
 
string
类型的啊,要包含
<string> 
回复人: 
luxes()
 
(2001-11-5 17:42:19)
0
 
加上
(LPCTSTR)
,相当于一个
const char *
了,还不能用?
 
回复人: 
wt007(tt)
 
(2001-11-5 17:48:33)
0
 
GetBuffer 
回复人: 
espon99()
 
(2001-11-5 17:54:06)
20
 
(LPSTR)(LPCTSTR)
回复人: 
ineedyou(
古寺僧
)
 
(2001-11-5 17:59:29)
0
 
...m_str.GetBuffer(needlen)...;
....
m_str.ReleaseBuffer() 
回复人: 
dusb(
保时捷
)
 
(2001-11-6 15:08:36)
0
 
espon99
大侠,果然是绝招,不过能否解释一下啊?
 
19
。如何从
CString
类型转换为
Unicode string
类型?
回复人: 
ychener(
贫血
)
 
(2001-10-20 10:28:48)
0
 
CString
本身就支持
Unicode
的。
只要你选择的是
UniCode
编译,生成的可执行程序就是支持
UniCode
 
回复人: 
ychener(
贫血
)
 
(2001-10-20 10:30:04)
0
 
CString
类是自适应的就像
TCHAR
一样,如果你定义了
UniCode
就会以
UniCode
编译
 
回复人: 
xjl1980_81(
阿龙
)
 
(2001-10-20 10:35:16)
0
 
不是呀,我有个函数中有一个参数需
Unicode string
类型的,比如应该填
L"abc",
而且引号中的内容要有变化,现在我有一个
temp
变量,是
CString
类型的,如何用呀?
 
回复人: 
xt_jat(
桑巴
)
 
(2001-10-20 10:39:37)
0
 
_T()
_TEXT()
行不行?
 
回复人: 
xjl1980_81(
阿龙
)
 
(2001-10-20 10:43:18)
0
 
不行
 
回复人: 
Jeffery__Chen()
 
(2001-10-20 11:04:53)
0
 
强制转化:
CString temp;
WCHAR wTemp = (WCHAR)temp; 
回复人: 
xjl1980_81(
阿龙
)
 
(2001-10-20 11:37:06)
0
 
to:Jeffery__Chen()
 
不对呀,出现不能转换的错误
 
回复人: 
hongzhh(
关儿
)
 
(2001-10-20 11:39:42)
0
 
问题是这样的:
temp
CString
类型变量,值为
zhh
现在有一个
API 
PCCERT_CONTEXT WINAPI CertFindCertificateInStore(
HCERTSTORE hCertStore, 
DWORD dwCertEncodingType, 
DWORD dwFindFlags, 
DWORD dwFindType, 
const void *pvFindPara, //
此处用
L"zhh"
没问题
 
//
请问怎么转换
可以
temp
PCCERT_CONTEXT pPrevCertContext 
);
在此谢谢大家,请帮忙看看
回复人: 
hongzhh(
关儿
)
 
(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
就是转换后的值
回复人: 
ychener(
贫血
)
 
(2001-10-23 11:43:05)
0
 
只要你用的是
CString
的函数就行的,如果你要用类似
strcpy
函数时,看看
MSDN
中一般情况下都有响应的函数对于
Unicode
的。只要换成
_tcscpy
等等。
 
回复人: 
ychener(
贫血
)
 
(2001-10-23 11:44:10)
0
 
你有没有定义
Unicode
宏?
 
20
。请问在用
ATL
且不支持
MFC
的组件开发中,如何将从数据库中读到的
DATE
数据类型转换回为字符串
?? 
复人: 
zhxuys(zhxuys)
 
(2001-9-24 10:36:47)
0
 
ATL
datetime
类型的列映射为
DBTIMESTAMP
类型,可取出该类型的
year
month
day
等,然后将这些数据传递回客户端,在客户端用
CTime
来构造
 
回复人: 
YUANXU(
)
 
(2001-9-24 11:18:14)
0
 
to zhxuys:CTime
MFC
类,在
ATL
不支持
MFC
时不能用。
DATE
其实质是个
double* 
回复人: 
zhxuys(zhxuys)
 
(2001-9-24 11:57:01)
0
 
你在客户端与服务器端只用
ATL
规定的数据类型或
VARIANT
类型,而在客户端,可以用
MFC
来重新构造想要的数据结构
 
21
。类型转换,
CString to wchar_t ??
CString ss("aabb");
wchar_t* cc;
cc=ss.AllocSysString();
22
。如何将
CString
类型转换为
_bstr_t
类型?
回复人: 
wei97081116(
韦小宝
)
 
(2001-9-4 11:19:30)
20
 
CString b;
_bstr_t a;
a=(_bstr_t)b; 
回复人: 
zhaozhen1212(
赵振
)
 
(2001-9-18 1:30:18)
0
 
_bstr_t a=b.AllocSysString();;
23
。如何把一个
CString
类型转换成一个普通的字符串,如
char*?
回复人: 
liu_feng_fly(
我恨死驱动程序了,哎,就是为了混口饭吃
)
 
(2001-9-17 18:00:52)
0
 
所以,直接用就可以,因为类里边有这样的转换函数
 
回复人: 
ydogg(
灰毛兔频频
)
 
(2001-9-17 18:01:21)
0
 
CString show;
char *p = show.GetBuffer(show.GetLength()); 
回复人: 
jiangping_zhu(
娜可露露之风之刃
)
 
(2001-9-17 18:02:05)
0
 
(char*)(LPCTSTR)str 
回复人: 
bmouse(
老鼠
)
 
(2001-9-18 0:10:56)
0
 
同意楼上
回复人: 
bmouse(
老鼠
)
 
(2001-9-18 0:13:22)
0
 
你还可以通过
GetBuff
来直接操作
CString
的缓冲区
,
不过要记着释放缓冲区
24
CString
类型转换成
unsigned char
类型吗??
回复人: 
LJN(*)
风流倜傥无人及,玉树偏又临风立
(*)
 
(2001-9-17 12:46:01)
0
 
可以用
CString.GetBuffer
函数
 
回复人: 
xpmao()
 
(2001-9-17 13:09:09)
0
 
CString strWork;
MessageBox(0,(LPSTR)strWork,0,0);
MessageBox(0,strWork.GetBuffer(0),0,0);
回复人: 
sandd(
降龙掌
)
 
(2001-9-17 13:17:32)
0
 
CString string;
(LPCTSTR)string; 
回复人: 
jeff_hunter(PandaLee)
 
(2001-9-17 13:45:30)
0
 
(unsigned char *)(LPCTSTR) 
回复人: 
fandh(
好了
)
 
(2001-9-17 14:00:57)
0
 
(unsigned char *)(LPCTSTR)
即可
 
回复人: 
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); 
回复人: 
swordbroken(
断剑书生
)
 
(2001-9-17 16:25:57)
0
 
CString str;
unsigned char string[30];
strcpy(string,str); 
25
。何将一个
unsigned int
类型变量值赋给类型为
unsigned short
的变量,并保证数值不丢失(当然数值在一定范围内
)
回复人: 
maxsuy(
魔法师兔子
)
 
(2001-8-14 16:37:30)
0
 
直接
=
OK
 
回复人: 
oppmm(ppmm)
 
(2001-8-14 16:38:11)
0
 
直接赋值
 
回复人: 
milefo(
弥勒佛
)
 
(2001-8-14 16:40:40)
0
 
如果数值在一定范围内怎么回丢失呢?
unsigned short a;
unsigned int b;
a=( b & 0xffff);
你试试看吧!
26
CString ----char* 
定义了
char* aa
的变量,现在有一个
CString
的变量
bb
,怎样把
bb
的值赋给
aa
回复人: 
emmai(WaTaXiWaWaTaXi)
 
(2001-8-10 11:57:33)
0
 
aa=bb.GetBuffer(); 
回复人: 
hswqs(??????????????????)
 
(2001-8-10 11:59:01)
0
 
aa= (LPSTR)(LPCTSTR)bb; 
回复人: 
ydogg(
灰毛兔
)
 
(2001-8-10 12:27:23)
0
 
1.aa=bb.GetBuffer(bb.GetLenth());//
第一种方法
2.aa= (LPSTR)(LPCTSTR)bb; //
第二种方法
 
回复人: 
zhizhi()
 
(2001-8-10 13:16:23)
0
 
aa= (char *)(LPCTSTR)bb,hehe 
27
。在一个
COM
的接口函数中有一个
BSTR*
类型的参数,需要把一个
char *
类型转换为
BSTR*
类型,不知道如何转换?
由于调用这个函数后需要把这个参数值再取出来所以只能用指针,另外在调用的时候应该用什么类型的数据传递参数呢?大虾帮忙。
BSTR bstr = SysAllocString(L"
字符串
");
这样转换
,
用的时候你用地址操作符
&
啊,要不指针还得
new 
回复人: 
yongyue2000i(
小吕
)
 
(2001-9-9 18:38:26)
13
 
CString str = "abcd";
BSTR bstr = str.AllocSysString(); 
回复人: 
houjzs()
 
(2001-9-9 19:14:44)
13
 
BSTR b = SysAllocString(OLESTR("your string"));
28
。要把一个
double
的数字输出到
CEdit
控件是否需要类型转换?
回复人: 
jiangsheng(
蒋晟
)
 
(2001-8-24 14:46:17)
0
 
void AFXAPI DDX_Text( CDataExchange* pDX, int nIDC, double& value ); 
回复人: 
xiezhsh(
雪中行
)
 
(2001-8-24 14:56:22)
0
 
假如你的CEdit相关的成员变量是Double型的,那根本用不着.(ClassWizard增加成员变量的对话框中,
Variable Type
选择
Double
可)
 
回复人: 
xiezhsh(
雪中行
)
 
(2001-8-24 14:58:16)
0
 
假如你的CEdit相关的成员变量不是Double型的,是CString型,那就需要用
ltoa()
来转换成CString型,
 
回复人: 
haven(
大天
)
 
(2001-8-24 14:58:32)
0
 
m_Edit.Fromat("%l",VarBouble);
updatedata(false); 
回复人: 
12345678()
 
(2001-8-24 14:59:54)
0
 
CString m_Edit.Format("%lf", doubleVar); 
GetDlgItem(EditID)->SetWindowText(m_strEdit); 
29
。该如何把
WINDOWPLACEMENT *
转换成
char **
类型
??
(char**)&pWP 
30
。怎样把
CString
的类型转换成
char*
型的?
回复人: 
dcz(dcz)
 
(2001-8-19 19:13:27)
5
 
// str is CString var
char* temp = strdup(str);
...
free(temp); 
回复人: 
yu900(
疾风之狼
)
 
(2001-8-19 19:57:25)
0
 
getbuffer()
;即可!
 
回复人: 
aileen_long(
挑战
2001)
 
(2001-8-19 21:10:35)
0
 
同意楼上的意见!
 
回复人: 
czh912()
 
(2001-8-19 21:27:08)
0
 
char buf[20];
printf(buf,"%s",string);
回复人: 
casl(casl)
 
(2001-8-19 22:59:44)
5
 
CString s("abc");
char* temp=s.GetBuffer(10);
...
s.ReleaseBuffer(); 
回复人: 
cocia(
高亚
)
 
(2001-8-19 23:04:23)
0
 
char* temp=s.GetBuffer(10);
10
是什么意思啊
回复人: 
kevin_dong(
梦仙人
)
 
(2001-8-20 10:26:35)
0
 
// str is CString var
char* temp = strdup(str);
// free
free(temp); 
我的这段代码在一个程序中能通过编译,但是在另外一个中总是出现
cannot convert parameter 1 from 'class CString' to 'const char *'
的错误。
str
temp
的类型都一样。这是为什么?
回复人: 
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
为两个结构类型
??
SA* A;
SB* B;
(SB*)A->...
(调用函数)
请问此时
A
的类型,是指向
SA
还是
SB
此时编译器是生成一个临时指针吗?
另外,
B=(SB*)A;
此时
A
又是什么类型???
回复贴子:
 
回复人: 
ddeng(
登登
)
 
(2001-8-9 17:13:58)
0
 
A
的类型始终是
SA *
B
的类型始终是
SB *
当进行强制类型转换时使的是临时指针
 
回复人: 
gold_water(
风雨无阻
)
 
(2001-8-9 17:30:46)
0
 
同意楼上的。
 
32
char buff[100],char UserName[50][100],
怎么将
buff
的值传给
UserName
,是其成为
UserName
数组中的某一项呢??
//0=<i<50
strcpy(UserName[i],buff); 
回复人: 
Ashura(
阿修罗
)
 
(2001-7-26 10:08:20)
0
 
呵呵,
benbensan
抢先一步。
 
回复人: 
tuita(
斗牛士
)
 
(2001-7-26 10:13:22)
0
 
for (i=0;i<100;i++)
*(*(username+x)+i)=*(buffer+i)
其中
0
X
50
benbensan
写的也对
回复人: 
kekeke(
我是来向大家学习的
)
 
(2001-7-26 10:24:22)
0
 
那反过来呢?把
UserName
中的某一项读出赋值给
buff
呢?怎么弄?
 
回复人: 
benbensan(
笨笨三
)
 
(2001-7-26 10:26:53)
0
 
//0=<i<50
strcpy(UserName[i],buff); 
回复人: 
benbensan(
笨笨三
)
 
(2001-7-26 10:28:15)
0
 
对不起,能错了,不过建议你看一下
C
语言了的指针和数组
//0=<i<50
strcpy(buff,UserName[i]); 
回复人: 
jfzsl(
剿匪总司令
)
 
(2001-7-26 10:32:57)
0
 
好好看看老潭的书先!
OK
 
回复人: 
kekeke(
我是来向大家学习的
)
 
(2001-7-26 10:44:25)
0
 
好。。。。!
 
33
。请问怎样把
SYSTEMTIME
类型转换成
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
的字节数
如何转换成
DWord
! ??
用强制类型转换呀
(DWord)eBeytes;
(DWord)Exponent[i];//(0<=i<=10);
回复人: 
xjl1980_81(
阿龙
)
 
(2001-7-26 16:47:29)
0
 
我是说把
e
转换成
DWORD
也就是说把
Exponent
中的内容转换成
DWORD
回复人: 
cloudshadow1(
云影
)
 
(2001-7-26 17:13:30)
0
 
用强制类型转换就可以了,(
DWORD
的高
24
位自动加
0
DWORD Des[10]
for (int i=0;i<11;i++)
Des[i]=Exponent[i];
至于那个
ULONG
的也是用强制类型软换就可以了
35
。请问怎样把
time_t
类型转换成
SYSTEMTIME
类型?
回复人: 
haven(
大天
)
 
(2001-7-26 17:12:36)
0
 
typedef struct _SYSTEMTIME
typedef long time_t
很明显不行嘛!
 
回复人: 
facexy(FACE
)
 
(2001-7-26 17:17:38)
0
 
哎呀,问错了,前后对象相反了;
-
忙昏了的结果
…………
另外,
TO
楼上的:
转换是可以的
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; 
回复人: 
zjh73(
大章鱼
)
 
(2001-7-26 20:28:28)
0
 
有两种方法:
1
、用
CTime
先用
time_t
类型构造一个
CTime
对象,再定义一个
SYSTEMTIME
结构,最后用
CTime
类的成员函数
GetAsSystemTime
将时间转换到
SYSTEMTIME
结构中
即可。
2
、用
gmtime
函数
gmtime
函数将
time_t
时间转换到
tm
结构中并返回一个
tm
指针,再将
tm
结构的相对应的项赋给
SYSTEMTIME
相对应的项即可,不过用这种方法要注
意这两种结构在天、星期等方面的记数方法有点区别,一个一般从
0
开始,一个一般从
1
开始,赋值时要注意校正,还有要注意的是
SYSTEMTIME
结构中有一项是毫秒,而
time_t
是以秒记数的。
 
回复人: 
zjh73(
大章鱼
)
 
(2001-7-26 20:32:13)
0
 
反过来也可以用
Ctime
类的方法
就是先用
SYSTEMTIME
结构构造一个
CTime
对象,在用
CTime
类中的成员函数
GetTime
返回一个对应的
time_t
即可。
36
。我现在正在学习
SDK
编程,遇到的问题是:
我定义了一个静态长整形变量,
static long lScore=0;
我想把窗口的标题换成长整形数值
,
SetWindowText
函数来实现,
由于它的第二个参数要求数据类型为
unsigned short *,
但用其来实现强制转换时
总是出现编译错误:
cannot convert parameter 2 from 'unsigned short *' to 'const char *'
后来改成来
LPCTSTR
来实现强制转换,没有出现编译错误,但函数总是执行不成功
,
请教各位高人,这倒底是怎么回事???
回复贴子:
 
回复人: 
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
回复人: 
lwg7603(
刑满释放人员
)
 
(2001-8-4 21:36:15)
0
 
TCHAR str[255]={_T('/0')};
_stprintf(str,_T("%d"),lScore);
SetWindowText(hwnd,str);
37
。我用
socket
发送的的
buf
中间需要的是
char *
类型的数据,我想将一个
struct
直接转换成
char *
发过去。
我用
struct ABCD *abcd;
char *buf;
abcd = (ABCD *)calloc(1,sizeof(ABCD));
buf = (char *)calloc(1,sizeof(ABCD));
///
abcd
中间赋值,其中有多个
char[]
的值和
int
的值
///
memcpy(buf,abcd,sizeof(ABCD));
//strcpy(buf,(char *)abcd)
;也不可以
sock(host,buf,....);
//sock(host,(char *)buf,...);
也不可以
问题就是在这里,这个
buf
中间的值总是不对,大家知道为什么否。
回复人: 
wolf721()
 
(2001-7-30 18:18:34)
5
 
你传的是个指针值,而不是数据
 
回复人: 
kiko_lee(
到处瞧瞧
)
 
(2001-7-30 18:50:49)
0
 
但是用
memcpy
这个是将整个数据都复制过去
 
回复人: 
lz_0618(lz_0618)
 
(2001-7-30 19:26:44)
5
 
你用的
VC???
改成
ABCD *abcd;
后编译一点问题也没有啊!
sock(host,buf,....);
这不知是什么,自定义函数?
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
中间赋值,其中有多个
char[]
的值和
int
的值
abcd[0].ID =1;
abcd[1].ID =2;
///
memcpy(buf,abcd,2*sizeof(ABCD));
strcpy(buf,(char *)abcd);//
也不可以
buf
中的内容也正确!!
回复人: 
kiko_lee(
到处瞧瞧
)
 
(2001-7-31 8:57:52)
0
 
我按照楼上的兄弟说的,做了一下,但是仍然做不下来,我用
memcpy(buf,abcd,sizeof(ABCD));
中间的
abcd
,不知道是不是地址的问题。
 
回复人: 
supersusheng(
小苏
)
 
(2001-7-31 14:30:42)
0
 
老大,你
sizeof()
得出的数值事多大,看看吧。
 
回复人: 
ydogg(
灰毛兔
)
 
(2001-7-31 14:41:52)
0
 
只能传递流数据,结构是传递不过去的。
 
回复人: 
IamNotMan(NorGirl)
 
(2001-7-31 14:50:53)
5
 
我常这么用
ABCD a ;
//
a
的各个域赋值(一定不能含有指针项)
char* buff = new char[sizeof(ABCD)];
memcpy(buff,&a,sizeof(ABCD));
//
或者
*
ABCD*)buff = a;
.................
如果
buff
里的数对,说明问题不在这儿吧
回复人: 
zb_china(
最后一座水车
zb_china
新浪
)
 
(2001-7-31 15:16:24)
0
 
看不明白
 
回复人: 
eggplant(
拉拉
)
 
(2001-7-31 15:42:48)
0
 
最好使用
memcpy(),
因为
struct
中的值有可能包含零字节,所以
strcpy
()可能不对,如果传递
struct,
最好把
struct
的字节对齐改为以字节为单位。
 
回复人: 
lvfengxun(lfx)
 
(2001-7-31 16:06:57)
5
 
直接将结构指针作为
send
的参数发就可以了
,
还用转换什么
有必要在这里讨论吗
?
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 
回复人: 
mydewang(mydewang)
 
(2001-7-31 16:33:21)
0
 
其实这里是一个字节对齐的问题
,
比如
struct AA
{
int a;
char b;
};
那么
sizeof( struct AA )
就不等于
5
,
而是
8
,
所以
,
将这个结构赋值给一个
char *,
里面会多出一些零
...
需要解决这个问题
,
可以在
Project->Setting->Link->Project Options
里加上
/Zp1
另外
,
可以参考一下
MSDN
/Zp
的编译选项
..... 
回复人: 
lz_0618(lz_0618)
 
(2001-7-31 19:43:54)
0
 
根本不是什么字节对齐的问题,我上面的程序经过测试都好用啊,这位老兄用我的那段程序究竟是什么错误,能说清楚点吗???
我这边用
socket
发送结构是一点问题也没有啊,而且是在
VC
Delphi
编的程序间通讯,当然,这时应该注意字节对齐的问题了,在
VC
程序间,
只要不是故意将服务器和客户端的编译环境设的不一样,肯定是没有什么问题的,最多是多传几个
Bit
罢了。
 
回复人: 
kiko_lee(
到处瞧瞧
)
 
(2001-8-3 11:02:51)
0
 
我发现将
char * memcpy
char *
中间都有点问题,但是如果放到
char []
中间就可以了,大家知道为什么否?
 
回复人: 
ydogg(
灰毛兔
)
 
(2001-8-3 11:40:35)
0
 
memcpy
copy
最后的
'/0'... 
回复人: 
wenjunlin2000(
微软克星
)
 
(2001-8-3 14:32:17)
0
 
是你看错了
因为
char*
是以
0
结尾的
回复人: 
mc_music(
狂沙
)
 
(2001-8-3 15:07:21)
0
 
请注意我的程序
:
struct ABCD *abcd;
char *buf;
abcd = (ABCD *)calloc(1,sizeof(ABCD));
//
初始化
abcd
buf=abcd;//
指针直接符值就可以了
 
回复人: 
zhangnanonnet(WinSockZhang)
 
(2001-8-3 16:21:03)
0
 
你试试把类型变为
BYTE 
回复人: 
kiko_lee(
到处瞧瞧
)
 
(2001-8-7 9:21:08)
0
 
不管了,给分,大家都有不少的建议呢。
 
38
double dou=12.34;
我如何可以得到
char * ch="12.34";
转换函数是什么?
回复人: 
wyzegg(
)
 
(2001-7-24 21:26:04)
50
 
double dou=12.34;
char * ch;
ch=malloc(100);
sprintf(ch,"%5.2f",dou); 
回复人: 
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 );
}
但是第一种常用
 
回复人: 
Matrix_w(
学会一点点
)
 
(2001-7-24 21:32:43)
30
 
int decimal, sign;
double dou =12.34;
char* ch;
ch = _ecvt(dou,4,&decimal,&sign);
回复人: 
imhua(
华弟
)
 
(2001-7-24 21:35:02)
20
 
double dou=12.34;
char *str;
gcvt(dou,5,str); //5
是长度
MessageBox(str); 
回复人: 
Matrix_w(
学会一点点
)
 
(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
中调用一个存储过程,存储过程有三个输入参数
@useradd char(30),@username char(10),@userage char(3)
,现在要把
char 
*addr,char *name,char *age
分别赋值给他们。
??
我做了如下定义:
_ParameterPtr para1;
_variant_t var1,var2,var3
==============================================================
var1.vt=VT_BSTR;
var1.bstrval=addr;/(
编译错误)
==============================================================
para1=m_pCommand->CreateParameter(L"useradd",adBSTR,adParamInput,30,var1);
m_pCommand->Parameters->Append(para1);
编译结果出现下面错误:
cannot convert from 'char *' to 'unsigned short *
不知道类型是不是选择
VT_BSTR?
回复人:
tar(GPS)
 
(2001-7-12 18:49:05)
15
 
var1.bstrval
应该指向宽字符的字符串,
unicode
字符串
use _bstr_t to convert it
_bstr_t var1(addr);
 回复人:
happyhackwang()
 
(2001-7-12 20:06:48)
5
 
char *
要进行转换成
BSTR
 回复人:
WhiteWaterBlueSky(
疯狂数码
)
 
(2001-7-13 9:35:15)
10
 
SDK
中是这样的
1
。先用
MultiByteToWideChar
char*
转为
wchar_t*
2
。再用
SysAllocString
wchar_t*
转为
BSTR 
 回复人:
tar(GPS)
 
(2001-7-13 14:10:01)
0
 
faint,
我都已经把语句写出来了
_bstr_t a(addr);
var1.vt=VT_BSTR;
var1.bstrval=(wchar_t *)a; 
 回复人:
xwchena(
西风之神
)
 
(2001-7-13 15:57:00)
0
 
大哥,我改完之后记录集无结果返回。我的代码是这样的:
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);
}
调试的时候看到执行完
m_pCommand->Execute()
m_pRecordset
就到了记录集的尾部
而如果把
char*
型都改成
int
型,结果就能返回记录集。
这是为什么啊???
 回复人:
tar(GPS)
 
(2001-7-13 19:19:51)
0
 
try adVarChar 
 回复人:
xwchena(
西风之神
)
 
(2001-7-13 22:54:21)
0
 
还是不行,记录集没有返回结果
 
 回复人:
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);
 
 

转载地址:http://yysqi.baihongyu.com/

你可能感兴趣的文章
Beginning VB 2005 Databases: From Novice to Professional
查看>>
Inside SQLite
查看>>
How to Cheat at Configuring Open Source Security Tools
查看>>
Microsoft SharePoint: Building Office 2007 Solutions in C# 2005
查看>>
Beginning Google Maps Applications with Rails and Ajax: From Novice to Professional
查看>>
Beginning JBoss® Seam: From Novice to Professional
查看>>
Professional XML
查看>>
Foundations of Security: What Every Programmer Needs to Know
查看>>
Pro WF: Windows Workflow in .NET 3.0
查看>>
Beginning SQL Server 2005 Express for Developers: From Novice to Professional
查看>>
Multimedia over IP and Wireless Networks: Compression, Networking, and Systems
查看>>
Hacking Ubuntu: Serious Hacks Mods and Customizations
查看>>
PHP 5 Advanced: Visual QuickPro Guide
查看>>
Adobe Illustrator CS3 Classroom in a Book
查看>>
Sams Teach Yourself Adobe Photoshop CS3 in 24 Hours
查看>>
FileMaker Pro 8.5 Bible
查看>>
AutoCAD: Secrets Every User Should Know
查看>>
Combating Spyware in the Enterprise
查看>>
Microsoft Windows Vista Unveiled
查看>>
How to Cheat at Securing a Wireless Network
查看>>