回 帖 发 新 帖 刷新版面

主题:关于GetOpenFileName的问题

从《Windows 程序设计》找出的,关于GetOpenFileName对话框传值的问题

static OPENFILENAME ofn;
  ....
BOOL DibFileOpenDlg (HWND hwnd, PTSTR pstrFileName, PTSTR pstrTitleName)
{
     ofn.hwndOwner         = hwnd ;
     ofn.lpstrFile         = pstrFileName ;
     ofn.lpstrFileTitle    = pstrTitleName ;
     ofn.Flags             = 0 ;
     
     return GetOpenFileName (&ofn) ;
}

实际的文件名不是要等到return时候的GetOpenFileName (&ofn);对话框选择的结果吗?

2个传入的参数 PTSTR pstrFileName, PTSTR pstrTitleName 是怎样被赋值为用户选择的文件名的? GetOpenFileName函数不是此时还没执行吗,因为是他下边的代码啊。

ofn.lpstrFile = pstrFileName;和
ofn.lpstrFileTitle = pstrTitleName;这2句赋值有什么意义啊?传进来的参数又不是用户通过对话框选择的文件名,就算是下面return时候的GetOpenFileName修改了ofn的这2个字段函数参数PTSTR pstrFileName, PTSTR pstrTitleName也不会跟着一起变化吧???? 难道ofn.lpstrFile和ofn.lpstrFileTitle是指向字符串指针的指针??很明显不是呀? 请问这是怎么回事啊??

回复列表 (共6个回复)

沙发


说了这么多,还不如去问MSDN更清楚

板凳

说得多是怕我描述得不清楚  不好意思了  其实我就是想知道  调用对打开话框之后,所选的文件路径被复制到OPENFILENAME结构的lpstrFileName中,但是程序中引用的并不是这个结构的lpstrFileName字段,那是怎样得到文件名的?

3 楼

ofn.lpstrFile         = pstrFileName ;这句是把一个地址赋给另一个地址,你说其中一个地址指向的值改变,另一个指向的值不是也跟着改变吗?

4 楼

a,b是2个指针,如果a = &X;  b = a;  a和b确实指向相同地址,但是下一步
b = &Y;之后,printf(*a);  可能是 Y 的值吗? 如果是strcpy(a,b);的话应该是吧

5 楼

ofn.hwndOwner         = hwnd ;
     ofn.lpstrFile         = pstrFileName ;
     ofn.lpstrFileTitle    = pstrTitleName ;
     ofn.Flags             = 0 ;
     
     return GetOpenFileName (&ofn) ;

该函数真正执行的只是return GetOpenFileName (&ofn) ;,即调用GetOpenFileName后返回。而之前的赋值操作在调用GetOpenFileName的时候完成,跟普通的 int i=0; 等变量初始化没区别。
看来楼主主要不懂的地方是到底那个参数是输入或输出参数,ofn.lpstrFileTitle    = pstrTitleName ;是输入参数,当调用GetOpenFileName的时候在弹出的对话框中显示标题。但是当用户确实选择了一个文件后返回时,这个文件路径要保存到那里呢?当然是ofn.lpstrFile 指向的空间里,对话框为什么会知道要保存到这里呢?因为在调用该对话框之前程序员已经用ofn.lpstrFile         = pstrFileName ;告诉它要将文件名保存到程序员指定的空间里,这个pstrFileName就是输出参数。因为当整个函数调用完毕后,文件名已保存到pstrFileName指向的空间里了。

如果你还是不明白,你大可以调试跟踪一遍,整个执行步骤就会很清楚。

6 楼

ofn.lpstrFile和  ofn.lpstrFileTitle 只是指针,并没有内存空间,初始化时要为其指定一块存放文件名的内存

我来回复

您尚未登录,请登录后再回复。点此登录或注册