程序关闭时的文件操作问题(100分)

  • 主题发起人 主题发起人 xiaochengyong
  • 开始时间 开始时间
X

xiaochengyong

Unregistered / Unconfirmed
GUEST, unregistred user!
程序关闭时的文件操作问题

一个程序Program1.exe,
1.运行时使用ADOTable->TableName="datafile.dbf";ADOTable->Active=true打开数据库文件datafile.dbf;
2.在退出程序前,执行ADOTable->Active=false(关闭datafile.dbf,用filemon可以看出,此时该文件是不会被关闭的,只有到Program1.exe结束时才会关闭);
3.在退出程序时,创建一个立即执行的进程Process1如下所示:
(Program1.exe的WinMain)
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
try
{
Application->Initialize();
...
}
...
STARTUPINFO si={sizeof(si)};
PROCESS_INFORMATION pi;
bool fSuccess=false;
AnsiString ProcessNameStr="Process1";
fSuccess=CreateProcess(NULL,
ProcessNameStr.c_str(),
NULL,NULL,
false,
0,
NULL,NULL,
&si,
&pi);
if(fSuccess)
{
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
}
return 0;
}

4.进程Process1执行时,先延时几秒Sleep(3000);在执行FileOpen("datafile.dbf",fmOpenRead)却会返回-1即不成功,这是为什么?盼望高手之点,谢谢!
 
试试这样改
SI.cb := SizeOf(SI);
去掉
if(fSuccess)
{
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
}
 
f=OpenFile(...);
if(f==HFILE_ERROR)
RaiseLastWin32Error();
这样做(RaiseLastWin32Error)的目的只是看看你不能打开的原因是什么,是不是你想象的共享冲突
还是别的原因。
有时候你认为是共享冲突,其实可能是别的原因造成的
 
另外说的问题是其他问题,和你这个错误无关:
STARTUPINFO si;
memset(&si,0,sizeof(si));
si.cb=sizeof(si);
 
我觉得可能是会打不开,XiaoChengyong可能只是想知道文件是不是没关掉,还是想知道
别的,如果的确是为了要使用,在FileOpen 中加入 fmShareDenyNone 可能就行了,
或者加批处理文件来做,不知道是否好一点
 
STARTUPINFO si={sizeof(si)};
SECURITY_ATTRIBUTES saProcess,saThread;
PROCESS_INFORMATION pi;
saProcess.nLength=sizeof(saProcess);
saProcess.lpSecurityDescriptor=NULL;
saProcess.bInheritHandle=false;
saThread.nLength=sizeof(saThread);
saThread.lpSecurityDescriptor=NULL;
saThread.bInheritHandle=false;

bool fSuccess=false;
AnsiString ProcessNameStr=ExtractFilePath(Application->ExeName)+"Data//ConsoleProject.exe";
fSuccess=CreateProcess(NULL,
ProcessNameStr.c_str(),
&saProcess,
&saThread,
false,
0,
NULL,NULL,
&si,
&pi);
if(fSuccess)
{
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
}
我也怀疑是文件内核对象的问题,但是我将代码改成如上所示,明确表示
子进程不继承父进程的内核对象,也不行.

另外,我还试了这样一种情况:
1.执行了Program1.exe
(ADOTable->TableName="datafile.dbf";ADOTable->Active=true,
不执行ADOTable->Active=false,不创建进程Process1)
2.这时,执行Process1。如果Process1中使用FileOpen("",fmOpenRead)
则打开文件不成功;如果Process1中使用FileOpen("",fmShareDenyNone)
则打开文件成功.

3.但是,如果执行Program1.exe(ADOTable->TableName="datafile.dbf";ADOTable->Active=true)
在Program1.exe退出时执行ADOTable->Active=false,创建进程Process1(使用的是FileOpen("",fmShareDenyNone) )却又是打开文件不成功???Why???
这和文件共享有没有关系.
 
我不是说 if(f==HFILE_ERROR) RaiseLastWin32Error(); 看看什么错误吗,都不用你猜的
 
后退
顶部