3
3h
Unregistered / Unconfirmed
GUEST, unregistred user!
<strong><font color="Blue">声明:以下均在DELPHI4中经历。</font><br><font color="red"><br>原委:</font></strong><br> 因为需要得到某一目录的打开句柄(皆为使用SetFileTime<br>函数可以使用...),花了狠久时间翻了好页帮助文件之后,终<br>于发现CreateFile()函数可以打开目录并获得句柄。<br> 大家看帮助文件,应该没问题吧:<br> (来自文件../Borland Shared/MSHelp/win32.hlp)<br>The CreateFile function creates or opens the <br>following objects and returns a handle that<br>can be used to access the object: <br> Files <br> pipes <br> mailslots <br> communications resources <br> disk devices (Windows NT only)<br> consoles <br> directories (open only)<br> ***********************<br>虽然是OPEN ONLY,也将就了,反正是取得其句柄即可。于是:<br><font color="Blue"><br>procedure TForm1.Button1Click(Sender: TObject);<br>Const<br> FileName = 'e:/123'; //这是一个已存在的目录<br>Var<br> q : THandle;<br>begin<br> try<br> Q := CreateFile( FileName+#0,<br> GENERIC_WRITE,<br> 0,<br> 0,<br> OPEN_ALWAYS ,<br> FILE_ATTRIBUTE_NORMAL,<br> 0);<br> ShowMessage(IntToStr(Q)); //看看它究竟是多少<br> if Q = INVALID_HANDLE_VALUE then<br> ShowMessageBox(FileName + ' open error.');<br> finally<br> CloseHandle(Q);<br> end;<br>end;<br></font><br>没想到得到的Q=4294967295,也就是-1,结果当然是显示<br>“打开错误”了。大家不妨看看函数的定义原型:<br><font color="Teal">HANDLE CreateFile(<br> LPCTSTR lpFileName,<br> // pointer to name of the file <br> DWORD dwDesiredAccess,<br> // access (read-write) mode <br> // 按要求设置为GENERIC_WRITE<br> DWORD dwShareMode,<br> // share mode<br> // 没什么好共享的<br> LPSECURITY_ATTRIBUTES lpSecurityAttributes, <br> // pointer to security attributes<br> // 没什么安全要求(95/98)所以忽略了<br> DWORD dwCreationDistribution, <br> // how to create <br> // 已存在的,就用OPEN_ALWAYS<br> DWORD dwFlagsAndAttributes,<br> // file attributes<br> // 来个一般属性罢:FILE_ATTRIBUTE_NORMAL<br> HANDLE hTemplateFile<br> // handle to file with attributes to copy<br> // 95/98明文禁止使用,不得已,用0.<br> );</font><br>返回值有两种情况:<br> 成功为句柄.<br> 失败为INVALID_HANDLE_VALUE (=-1).<br>很不幸,此例的结果属于后者。<br>至于详细的帮助大家可看看开始菜单中<br>Borland Delphi 4<br> /Help<br> /MS SDK Help Files<br> /Win32 Programmer's Reference<br> -> CreateFile<br>的描述,算是比较详细了。<br><font color="red"><strong><br>不过我不明白的是,如果将上面的FileName换成一个文件,<br>就能返回成功的句柄,只要是目录,此功能就会失败!<br>究竟是什么原因?是我在程序中参数有错误?还是......<br>MS的帮助文件有错误?它的函数没有支持这样的功能?<br></strong><br>请求大家解答,<br>特别是高手们,<br>对MS有严重催残倾向对DELPHI有明显爱癖的朋友们。</font>