cfiledialog(什么是cfiledialog)
一、调用CfileDialog时为什么说我未定义
首先考虑是否正确添加了相关的头文件(afxdlgs.h)(应该自动添加的才对)
然后查看源文件中添加的头文件的排列顺序,这往往是导致问题的一个原因
尤其头文件之间有互相嵌套时。
提醒一下,编译错误一般只做参考,也就是出错了,但并不一定就是编译器提示的出错位置,需要根据经验和代码实际情况查看
如果我上述的提示不能解决问题,可以的话,建议你贴出部分出错代码,可以帮你辅助分析
二、怎么用CFileDialog 选择文件夹
CString
BrowseFolder(HWND
hWnd,
LPCTSTR
lpTitle)
{
char
szPath[MAX_PATH]={0};
BROWSEINFO
m_bi;
m_bi.ulFlags
=
BIF_RETURNONLYFSDIRS
|
BIF_STATUSTEXT;
m_bi.hwndOwner
=
hWnd;
m_bi.pidlRoot
=
NULL;
m_bi.lpszTitle
=
lpTitle;
m_bi.lpfn
=
NULL;
m_bi.lParam
=
NULL;
m_bi.pszDisplayName
=
szPath;
LPITEMIDLIST
pidl
=
::SHBrowseForFolder(
&m_bi
);
if
(
pidl
)
{
if(
!::SHGetPathFromIDList
(
pidl,
szPath
)
)
szPath[0]=0;
IMalloc
*
pMalloc
=
NULL;
if
(
SUCCEEDED
(
::SHGetMalloc(
&pMalloc
)
)
)
//
取得IMalloc分配器接口
{
pMalloc->Free(
pidl
);
//
释放内存
pMalloc->Release();
//
释放接口
}
}
return
szPath;
}
=============================================================
调用
void
CFlorderDlg::OnButton1()
{
//
TODO:
Add
your
control
notification
handler
code
here
CString
SelectPath=BrowseFolder(this->m_hWnd,"选择目录");
AfxMessageBox(SelectPath);
}
用户在磁盘上寻找文件时,所历经的文件夹线路叫路径。路径分为绝对路径和相对路径。
1】绝对路径:从根文件夹开始的路径,以“\”作为开始。
2】相对路径:从当前文件夹开始的路径。
DOS程序命令中:d代表盘符
p代表路径
0(零)代表文件本身,%~dp0就是文件所在的完整路径
Windows应用中文件夹路径就是当打开文件夹时地址栏显示的信息,如
H:\Downloads\Game代表的就是Game文件夹的完整路径
三、cfileDialog出现的问题是为什么
使用CFileDialog选择文件了以后,会在其内部调用“SetCurrentDirectory“设置被选择文件的目录为当前路径。
因此如果文件和程序不在同一路径,那么CreateProcess使用内部调用的相对路径就可能找不到对应程序,所以导致createprocess出现错误代码2的情况。解决办法是CreateProcess使用可执行文件的绝对路径便可以解决文件和程序不在同一路径的问题。
扩展资料:
CreateProcess部分参数含义
1、lpApplicationName
指向一个NULL结尾的、用来指定可执行模块的字符串。
这个字符串可以是可执行模块的绝对路径,也可以是相对路径,在后一种情况下,函数使用当前驱动器和目录建立可执行模块的路径。
这个参数可以被设为NULL,在这种情况下,可执行模块的名字必须处于 lpCommandLine参数最前面并由空格符与后面的字符分开。
2、lpCommandLine
指向一个以NULL结尾的字符串,该字符串指定要执行的命令行。这个参数可以为空,那么函数将使用lpApplicationName参数指定的字符串当做要运行的程序的命令行。
如果lpApplicationName和lpCommandLine参数都不为空,那么lpApplicationName参数指定将要被运行的模块,lpCommandLine参数指定将被运行的模块的命令行。
新运行的进程可以使用GetCommandLine函数获得整个命令行。C语言程序可以使用argc和argv参数。
3、lpProcessAttributes
指向一个SECURITY_ATTRIBUTES结构体,这个结构体决定是否返回的句柄可以被子进程继承。如果lpProcessAttributes参数为空(NULL),那么句柄不能被继承。
在Windows NT中:SECURITY_ATTRIBUTES结构的lpSecurityDescriptor成员指定了新进程的安全描述符,如果参数为空,新进程使用默认的安全描述符。
4、lpThreadAttributes
同lpProcessAttribute,不过这个参数决定的是线程是否被继承,通常置为NULL。