关于‘\0’的问题,高手请进

时间:2022-01-18 18:40:33
我使用BOOL SQLConfigDataSource(
   HWND   hwndParent,
   WORD   fRequest,
   LPCSTR   lpszDriver,
   LPCSTR   lpszAttributes)
设置数据源
从MSDN知道最后一个参数是数据源的各项参数,如“DSN=TryDB\0DBQ=D:\\Database\\ 
try.mdb\0”各项之间用‘\0’分隔,数据源名叫TryDB,文件名是D:\\Database\\ 
try.mdb
当用这样的字符串调用函数时结果完全正确。
而当文件名动态获得时,就不对了如:
LPCSTR strAttri = "DSN=TryDB\0DBQ="+CString(lpfullpathname)+"\\database\\try.mdb\0";
我觉得是中间的\0的问题,不知道怎么解决。

30 个解决方案

#1


有些不是以'\0'而是以0来结束的.

#2


你应该用strcpy和strcat,注意要先给strAttri分配空间,
或者简单的办法是你用CString操作字符串,最后用的时候(LPCTSTR)强制转化一下就好了

#3


是不是字符串加的问题,跟踪一下,看看加之后字符串的值

#4


'\0'和0是一个东西

#5


'\0'和0是一个东西

#6


我也用过CString 运算后,转化成LPCTSTR,结果也不正确。

#7


不是,最后应该有两个\0

#8


这是ODBC sdk参考的原文:
ConfigDSN以在关键字值对表格的属性列表,从安装程序DLL接受连接信息。每对以空字节结束,并且整个列表以空字节结束(即是,两个空字节标记列表结束)。在关键字值对,不允许等号旁有空格。ConfigDSN能接受对SQLBrowseConnect和SQLDriverConnect无效的关键字。ConfigDSN不需要支持所有对SQLBrowseConnect和SQLDriverConnect有效的关键字(ConfigDSN不接受DRIVER关键字)。ConfigDSN函数使用的关键字必须支持使用安装程序的AUTO设置特性重新创建数据源的所有选项。ConfigDSN使用的值和连接字符串值相同时,使用相同的关键字。

#9


LPCTSTR 不能像CString那样+的

#10


空终止符的字符串就是一般的字符串,比如char str[5]="ABCD";就是一个{'A','B','C','D',0}的数组

#11


楼上的,估计楼主还不至于吧:目

#12


楼上的,估计楼主还不至于吧:目

#13


跟踪一下,看
LPCSTR strAttri = "DSN=TryDB\0DBQ="+CString(lpfullpathname)+"\\database\\try.mdb\0";
这行执行万之后,LPCSTR等于什么,不过最后好像需要两个'\0'吧?

#14


两个‘\0’也试了,也不行。跟踪了,看不到值。

#15


现在的问题是‘\0’在字符串中怎么表示,字符串中都是以'\0'结尾的啊,会不会把后面的忽略了,如果那样怎么表示呢?

#16


LPCSTR有怎么来运算呢,难道没办法吗?各位

#17


DSN=Personnel Data\0UID=Smith\0PWD=Sesame\0DATABASE=Personnel\0\0
抱歉,那你应该用
char str[256];
char *p=str;
int iLen=0;

strcpy(p,"DSN=Personnel Data");
iLen=strlen(p);
p+=iLen+1;

strcpy(p,"UID=Smith");
iLen=strlen(p);
p+=iLen+1;
//…………
p[0]=0;

#18


不要用CString的运算

#19


用memcpy

#20


不要用CString类字串。你试试这个行不行:(有可能不成功的)
char filename[1024];
strcpy(filename,"c:\\db\\customer.mdb");
char connectstr[2048];
ZeroMemory(connectstr,2048);//这样有两个\0\0也不怕了。
strcpy(connectstr,"DSN=TryDB\0DBQ="); 
//这里有个\0,可能复制不过去。实在不行就不用什么strcpy与strcat,用connectstr[i]数组循环操作数据。
strcat(connectstr,filename);

#21


哈哈,好像就是这个问题:在CString 中0不认为是其结束符只有'\0'才被认为是结束符,而在char中0则被认为是结束符,我估计是你CString 和LPCSTR转化的时候出现了问题!

#22


bluebohe(薄荷)说的不完整啊,: yl0002(yl) 说的也不行啊。有没有人使用过这个函数的?

#23


不完整吗?比如说我想将str赋值成以下值

DSN=Personnel Data\0UID=Smith\0PWD=Sesame\0DATABASE=Personnel\0\0
 
通过以下程序
         char str[256];
char *p=str;
int iLen=0;

strcpy(p,"DSN=Personnel Data");
iLen=strlen(p);
p+=iLen+1;

strcpy(p,"UID=Smith");
iLen=strlen(p);
p+=iLen+1;

strcpy(p,"PWD=Sesame");
iLen=strlen(p);
p+=iLen+1;

strcpy(p,"DATABASE=Personnel");
iLen=strlen(p);
p+=iLen+1;

p[0]=0;

这样子str不是就达到你的要求了吗?我调试过了,应该可以用吧

#24


如果要把str赋值成上面的,只要把\0写成\\0不就行了,两个\在字符串里是一个啊,肯定不行的。

#25


我上面的程序的意思是把str写成
DSN=Personnel Data  UID=Smith  PWD=Sesame  DATABASE=Personnel   
'\0'分隔,而不是"\\0分隔"啊,

#26




  用这个------------->';'或者'|'

#27


参考:
http://vcp4.51.net/VC/DataBase.htm
第1条

#28


参考:
http://vcp4.51.net/VC/DataBase.htm
第1条

#29


bluebohe(薄荷) 说的很正确,一定要用char*,而不能使用CString 操作,我已经测试通过,谢谢。

#30


呵呵,我以前没看清楚问题,就瞎发言,也不对啊

#1


有些不是以'\0'而是以0来结束的.

#2


你应该用strcpy和strcat,注意要先给strAttri分配空间,
或者简单的办法是你用CString操作字符串,最后用的时候(LPCTSTR)强制转化一下就好了

#3


是不是字符串加的问题,跟踪一下,看看加之后字符串的值

#4


'\0'和0是一个东西

#5


'\0'和0是一个东西

#6


我也用过CString 运算后,转化成LPCTSTR,结果也不正确。

#7


不是,最后应该有两个\0

#8


这是ODBC sdk参考的原文:
ConfigDSN以在关键字值对表格的属性列表,从安装程序DLL接受连接信息。每对以空字节结束,并且整个列表以空字节结束(即是,两个空字节标记列表结束)。在关键字值对,不允许等号旁有空格。ConfigDSN能接受对SQLBrowseConnect和SQLDriverConnect无效的关键字。ConfigDSN不需要支持所有对SQLBrowseConnect和SQLDriverConnect有效的关键字(ConfigDSN不接受DRIVER关键字)。ConfigDSN函数使用的关键字必须支持使用安装程序的AUTO设置特性重新创建数据源的所有选项。ConfigDSN使用的值和连接字符串值相同时,使用相同的关键字。

#9


LPCTSTR 不能像CString那样+的

#10


空终止符的字符串就是一般的字符串,比如char str[5]="ABCD";就是一个{'A','B','C','D',0}的数组

#11


楼上的,估计楼主还不至于吧:目

#12


楼上的,估计楼主还不至于吧:目

#13


跟踪一下,看
LPCSTR strAttri = "DSN=TryDB\0DBQ="+CString(lpfullpathname)+"\\database\\try.mdb\0";
这行执行万之后,LPCSTR等于什么,不过最后好像需要两个'\0'吧?

#14


两个‘\0’也试了,也不行。跟踪了,看不到值。

#15


现在的问题是‘\0’在字符串中怎么表示,字符串中都是以'\0'结尾的啊,会不会把后面的忽略了,如果那样怎么表示呢?

#16


LPCSTR有怎么来运算呢,难道没办法吗?各位

#17


DSN=Personnel Data\0UID=Smith\0PWD=Sesame\0DATABASE=Personnel\0\0
抱歉,那你应该用
char str[256];
char *p=str;
int iLen=0;

strcpy(p,"DSN=Personnel Data");
iLen=strlen(p);
p+=iLen+1;

strcpy(p,"UID=Smith");
iLen=strlen(p);
p+=iLen+1;
//…………
p[0]=0;

#18


不要用CString的运算

#19


用memcpy

#20


不要用CString类字串。你试试这个行不行:(有可能不成功的)
char filename[1024];
strcpy(filename,"c:\\db\\customer.mdb");
char connectstr[2048];
ZeroMemory(connectstr,2048);//这样有两个\0\0也不怕了。
strcpy(connectstr,"DSN=TryDB\0DBQ="); 
//这里有个\0,可能复制不过去。实在不行就不用什么strcpy与strcat,用connectstr[i]数组循环操作数据。
strcat(connectstr,filename);

#21


哈哈,好像就是这个问题:在CString 中0不认为是其结束符只有'\0'才被认为是结束符,而在char中0则被认为是结束符,我估计是你CString 和LPCSTR转化的时候出现了问题!

#22


bluebohe(薄荷)说的不完整啊,: yl0002(yl) 说的也不行啊。有没有人使用过这个函数的?

#23


不完整吗?比如说我想将str赋值成以下值

DSN=Personnel Data\0UID=Smith\0PWD=Sesame\0DATABASE=Personnel\0\0
 
通过以下程序
         char str[256];
char *p=str;
int iLen=0;

strcpy(p,"DSN=Personnel Data");
iLen=strlen(p);
p+=iLen+1;

strcpy(p,"UID=Smith");
iLen=strlen(p);
p+=iLen+1;

strcpy(p,"PWD=Sesame");
iLen=strlen(p);
p+=iLen+1;

strcpy(p,"DATABASE=Personnel");
iLen=strlen(p);
p+=iLen+1;

p[0]=0;

这样子str不是就达到你的要求了吗?我调试过了,应该可以用吧

#24


如果要把str赋值成上面的,只要把\0写成\\0不就行了,两个\在字符串里是一个啊,肯定不行的。

#25


我上面的程序的意思是把str写成
DSN=Personnel Data  UID=Smith  PWD=Sesame  DATABASE=Personnel   
'\0'分隔,而不是"\\0分隔"啊,

#26




  用这个------------->';'或者'|'

#27


参考:
http://vcp4.51.net/VC/DataBase.htm
第1条

#28


参考:
http://vcp4.51.net/VC/DataBase.htm
第1条

#29


bluebohe(薄荷) 说的很正确,一定要用char*,而不能使用CString 操作,我已经测试通过,谢谢。

#30


呵呵,我以前没看清楚问题,就瞎发言,也不对啊