对于GetPrivateProfileString的问题

sunlau29 2008-04-10 04:05:12
使用GetPrivateProfileString的时候,窗口不能正常显示,会报错关闭,代码如下:


LRESULT CALLBACK WndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
static HDC hdc;
static PAINTSTRUCT ps;
hdc=GetDC(hWnd);
static int PosY=10;
char ch[]="";
LPCSTR str;

switch(uMsg)
{
case WM_CLOSE:
PostQuitMessage(0);
return 0;

case WM_CREATE:
GetPrivateProfileString("BackGround","Path",NULL,ch,18,".\\current.ini");

return 0;

case WM_PAINT:
hdc=BeginPaint(hWnd,&ps);
SetBkColor(hdc,RGB(255,255,255));
SetTextColor(hdc,RGB(0,0,0));
str=ch;
TextOut(hdc,10,PosY,str,strlen(str));

EndPaint(hWnd,&ps);
return 0;
}
return DefWindowProc(hWnd,uMsg,wParam,lParam);
}

ini 文件里面的内容是:

[BackGround]
Path=McDou/McDou.bmp
...全文
216 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
cnzdgs 2008-04-12
  • 打赏
  • 举报
回复
static char ch[18];
cnzdgs 2008-04-12
  • 打赏
  • 举报
回复
你现在的ch是局部动态变量,函数返回后就释放了,下次再调这个函数就又变成其它内容了。你可以用全局变量或者静态变量。
sunlau29 2008-04-12
  • 打赏
  • 举报
回复
我终于明白了,GetPrivateProfileString不能放在create里面。放在WM_CREATE里面,在paint里面无法得到ch的值。
sunlau29 2008-04-12
  • 打赏
  • 举报
回复
在控制台下用程序
int main()
{
char ch[25];
LPCSTR str;
GetPrivateProfileString("CloseButton","Path0",NULL,ch,sizeof(ch),".\\current.ini");

for(int i=0;i<25;i++) cout<<ch[i];
cout<<endl;

str=ch;
cout<<str;

return 0;
}
测试了,ch和str都能正确输出ini文件里面的内容,但是为什么在win32 的textout里面就不行了呢?
sunlau29 2008-04-12
  • 打赏
  • 举报
回复
强转还是没用。如果ch不是在GetPrivateProfileString获取ini文件的字符串,而是在定义的时候给它初始化一段字符串,那不用强转也能把它赋给str,并能正确在textout里面输出它的字符。但是用了GetPrivateProfileString之后,就不能正确输出了,但是ch数组里面的每一个字符跟ini里面的那串字符串所对应的字符是一样的,我用if语句测试了。
用户 昵称 2008-04-12
  • 打赏
  • 举报
回复
这感觉不是挺复杂吧,你强制转化一下。
sunlau29 2008-04-12
  • 打赏
  • 举报
回复
把textout长度strlen(str)改成1 ,窗口显示的结果是很奇怪的字符。网上说字集不对,我用的是VC 6,不知道怎么弄。 请大家告诉我,怎么能从GetPrivateProfileString中取得 LPCSTR类型的字符串? 在我的VC下直接把 LPCSTR的变量放里面做参数不行,所以才有以上的代码。
sunlau29 2008-04-11
  • 打赏
  • 举报
回复
不是打印,而是直接在窗口上显示字符。
scq2099yt 2008-04-11
  • 打赏
  • 举报
回复
up
snow_haoxue 2008-04-11
  • 打赏
  • 举报
回复
你是要在dc中“打印”内容么?
我也遇到过,可能是一样的问题
试试下面的代码:
……
case WM_PAINT:
hdc=BeginPaint(hWnd,&ps);

DOCINFO diPrint;
//initalize the print document information
diPrint.cbSize = sizeof(DOCINFO);
diPrint.lpszDocName = _T("any title that you want to save as");
diPrint.lpszOutput = (LPTSTR) NULL;
diPrint.lpszDatatype = (LPTSTR) NULL;
diPrint.fwType = 0;
StartDoc(hdc,&diPrint);
StartPage(hdc);


SetBkColor(hdc,RGB(255,255,255));
SetTextColor(hdc,RGB(0,0,0));
str=ch;
TextOut(hdc,10,PosY,str,strlen(str));

EndPage(hdc);
EndDoc(hdc);


EndPaint(hWnd,&ps);
return 0;

……
sunlau29 2008-04-10
  • 打赏
  • 举报
回复
改成 char ch[255] 后没报错了。 感谢各位。
可是TextOut没显示结果,是什么原因呢。
mr.zhoux 2008-04-10
  • 打赏
  • 举报
回复
第一眼就看出这个的问题了char ch[]="";
换成char ch[255] = "\0";试试
snow_haoxue 2008-04-10
  • 打赏
  • 举报
回复
GetPrivateProfileString("BackGround","Path",NULL,ch,18,".\\current.ini");
改为:
GetPrivateProfileString("BackGround","Path","NULL",ch,18,".\\current.ini");
试试看

同时建议,写完整的路径名(绝对路径),检查相应路径下指定的文件是否存在
shakaqrj 2008-04-10
  • 打赏
  • 举报
回复
ch只有sizeof("")这么大
vrace 2008-04-10
  • 打赏
  • 举报
回复
LRESULT CALLBACK WndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
static HDC hdc;
static PAINTSTRUCT ps;
hdc=GetDC(hWnd);
static int PosY=10;
char ch[]=""; // 这样是不行的,要这样 char ch[100];
LPCSTR str;
...
...
...

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧