疑惑CreateFile参数设置为FILE_SHARE_READ,其他程序还是不能读?

BAO BAO 2015-10-03 11:19:58
#include <windows.h>
#include <stdio.h>
int main()
{
DWORD dwBytes;
char data[] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
HANDLE hFile = CreateFile("temp.txt",GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_FLAG_DELETE_ON_CLOSE,NULL);
WriteFile(hFile,data,sizeof(data)-1,&dwBytes,NULL);

getchar(); //此时,手动记事本打开temp.txt 不能打开说是占用(明明使用了FILE_SHARE_READ)
CloseHandle(hFile);
return 0;
}
...全文
1550 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
hnnnb 2017-04-27
  • 打赏
  • 举报
回复
记事本再打开文件时会试图请求所有权限,如果不能读取就会提示被占用。如果能读不能写则修改才会提示被占用。如果有别的程序占用了一部分权限,那么记事本将会请求剩下的所有权限。但是别忘了,记事本打开文件时请求了所有权限但仅仅使用了读取权限一项,而如果请求到了写入权也仅会在修改时使用,也就是说请求到的权限不会都使用。所以你要实现这个读写就要再单独写一个以只读打开文件的程序来读文件。 但是记住,如果记事本不能读取文件,哪怕写入权限开放也不能写入,但是自己的程序是可以的。 希望我能帮到你。
earllhc 2015-10-19
  • 打赏
  • 举报
回复
你好,请问你的这个问题解决了吗?
BAO BAO 2015-10-08
  • 打赏
  • 举报
回复
引用 13 楼 bluewanderer 的回复:
[quote=引用 8 楼 wqte45 的回复:] [quote=引用 6 楼 bluewanderer 的回复:] 首先,题外话写文件开share_read本来就是作死。 然后,Notepad根本不支持只读打开。 最后,搞清楚share_read是允许别的程序用读模式打开文件,这个时候如果别的程序请求读以外的权限就会失败,而不是只要请求了读权限就能成功。
首先,您在回帖之前一定没做测试吧,另外我不得不说 你没看明白我问的问题,其次记事本是可以打开已创建share_read属性文本文件的,CreateFile("gp.txt",GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); 比如这句 是用FILE_ATTRIBUTE_NORMAL正常属性创建的文件,即使后面还有代码运行 以及文件句柄还没关闭,此时就可以 用记事本打开刚创建的gp.txt。我的问题是 为什么 我用FILE_FLAG_DELETE_ON_CLOSE属性创建文件,FILE_SHARE_READ标记就不起作用了。。。。。FILE_FLAG_DELETE_ON_CLOSE属性的意思是 创建一个文件 关闭句柄时会被自动删除,
#include <windows.h>
#include <stdio.h>
int main()
{
	DWORD dwBytes;
	char data[] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
	HANDLE hFile = CreateFile("temp.txt",GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
	WriteFile(hFile,data,sizeof(data)-1,&dwBytes,NULL);
    WinExec("notepad temp.txt",SW_SHOW);  //此时就能打开,楼上的说GENERIC_WRITE写文件同时FILE_SHARE_READ共享,不能用。扯淡
	getchar(); 
	CloseHandle(hFile);         
	return 0;
}
下面我用FILE_FLAG_DELETE_ON_CLOSE属性替换FILE_ATTRIBUTE_NORMAL属性
#include <windows.h>
#include <stdio.h>
int main()
{
	DWORD dwBytes;
	char data[] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
	HANDLE hFile = CreateFile("temp.txt",GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_FLAG_DELETE_ON_CLOSE,NULL);
	WriteFile(hFile,data,sizeof(data)-1,&dwBytes,NULL);
    WinExec("notepad temp.txt",SW_SHOW);  //此时就不能打开 提示被占用  同样都是,FILE_SHARE_READ,。
	getchar(); 
	CloseHandle(hFile);        
	return 0;
}
所以我质疑使用 FILE_FLAG_DELETE_ON_CLOSE 属性 ,FILE_SHARE_READ会不起作用,但我不确定,就上来请教大家。FILE_FLAG_DELETE_ON_CLOSE属性不懂自己查,当用此属性创建文件时候,关闭句柄后 会自动删除所创建的文件,做临时文件最适合。但我需要在被创建后 被第三方程序调用读取加载,正常属性都可以,除了这个 FILE_FLAG_DELETE_ON_CLOSE,所有就出现了此贴。 如果真不行 我只能用普通属性创建 ,最后用deletefile来删除了。 以上就是我的第一个问题。我就不明白了 我用CreateFile("temp.txt",GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); 怎么就作死了 我按照msdn来写文件 到你这里就作死了。我这样写也没提示错误 啊[/quote] 没仔细看,发现Notepad进化了=-=... 不过既然你看文档了就应该知道还有个share_delete吧。[/quote] share_delete 对我没什么用。我就想用FILE_FLAG_DELETE_ON_CLOSE,既然用此属性的时候 不能共享给其他程序读,那我就在关闭句柄后 DeleteFile就好了,用不着share_delete。我又不着急是否在关闭句柄前删除。
bluewanderer 2015-10-08
  • 打赏
  • 举报
回复
引用 8 楼 wqte45 的回复:
[quote=引用 6 楼 bluewanderer 的回复:] 首先,题外话写文件开share_read本来就是作死。 然后,Notepad根本不支持只读打开。 最后,搞清楚share_read是允许别的程序用读模式打开文件,这个时候如果别的程序请求读以外的权限就会失败,而不是只要请求了读权限就能成功。
首先,您在回帖之前一定没做测试吧,另外我不得不说 你没看明白我问的问题,其次记事本是可以打开已创建share_read属性文本文件的,CreateFile("gp.txt",GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); 比如这句 是用FILE_ATTRIBUTE_NORMAL正常属性创建的文件,即使后面还有代码运行 以及文件句柄还没关闭,此时就可以 用记事本打开刚创建的gp.txt。我的问题是 为什么 我用FILE_FLAG_DELETE_ON_CLOSE属性创建文件,FILE_SHARE_READ标记就不起作用了。。。。。FILE_FLAG_DELETE_ON_CLOSE属性的意思是 创建一个文件 关闭句柄时会被自动删除,
#include <windows.h>
#include <stdio.h>
int main()
{
	DWORD dwBytes;
	char data[] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
	HANDLE hFile = CreateFile("temp.txt",GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
	WriteFile(hFile,data,sizeof(data)-1,&dwBytes,NULL);
    WinExec("notepad temp.txt",SW_SHOW);  //此时就能打开,楼上的说GENERIC_WRITE写文件同时FILE_SHARE_READ共享,不能用。扯淡
	getchar(); 
	CloseHandle(hFile);         
	return 0;
}
下面我用FILE_FLAG_DELETE_ON_CLOSE属性替换FILE_ATTRIBUTE_NORMAL属性
#include <windows.h>
#include <stdio.h>
int main()
{
	DWORD dwBytes;
	char data[] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
	HANDLE hFile = CreateFile("temp.txt",GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_FLAG_DELETE_ON_CLOSE,NULL);
	WriteFile(hFile,data,sizeof(data)-1,&dwBytes,NULL);
    WinExec("notepad temp.txt",SW_SHOW);  //此时就不能打开 提示被占用  同样都是,FILE_SHARE_READ,。
	getchar(); 
	CloseHandle(hFile);        
	return 0;
}
所以我质疑使用 FILE_FLAG_DELETE_ON_CLOSE 属性 ,FILE_SHARE_READ会不起作用,但我不确定,就上来请教大家。FILE_FLAG_DELETE_ON_CLOSE属性不懂自己查,当用此属性创建文件时候,关闭句柄后 会自动删除所创建的文件,做临时文件最适合。但我需要在被创建后 被第三方程序调用读取加载,正常属性都可以,除了这个 FILE_FLAG_DELETE_ON_CLOSE,所有就出现了此贴。 如果真不行 我只能用普通属性创建 ,最后用deletefile来删除了。 以上就是我的第一个问题。我就不明白了 我用CreateFile("temp.txt",GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); 怎么就作死了 我按照msdn来写文件 到你这里就作死了。我这样写也没提示错误 啊[/quote] 没仔细看,发现Notepad进化了=-=... 不过既然你看文档了就应该知道还有个share_delete吧。
bluewanderer 2015-10-08
  • 打赏
  • 举报
回复
引用 9 楼 wqte45 的回复:
[quote=引用 7 楼 bluewanderer 的回复:] 准确地说是你这操作一边写还一边开share_read属于作死,还是有其他情况需要一边写另一边读的...
您不会看代码吗? 操作一边写还一边开share_read 不行吗?怎么就作死了? 别说是我写数据到文件是在完成后 ,才用第三方程序调用的,就算我多线程 一边写入数据,令一线程同时来读取内容 又怎么了? msdn上哪说GENERIC_WRITE创建文件时,不能用FILE_SHARE_READ老共享,难道一直用0 来独占吗?[/quote]
引用 9 楼 wqte45 的回复:
[quote=引用 7 楼 bluewanderer 的回复:] 准确地说是你这操作一边写还一边开share_read属于作死,还是有其他情况需要一边写另一边读的...
您不会看代码吗? 操作一边写还一边开share_read 不行吗?怎么就作死了? 别说是我写数据到文件是在完成后 ,才用第三方程序调用的,就算我多线程 一边写入数据,令一线程同时来读取内容 又怎么了? msdn上哪说GENERIC_WRITE创建文件时,不能用FILE_SHARE_READ老共享,难道一直用0 来独占吗?[/quote] 正因为行所以在会死,拿墙围起来的悬崖你还能跳么-v-bb
赵4老师 2015-10-08
  • 打赏
  • 举报
回复
《Windows核心编程》 《深入解析Windows操作系统-Windows Internals》
赵4老师 2015-10-08
  • 打赏
  • 举报
回复
_locking Locks or unlocks bytes of a file. int _locking( int handle, int mode, long nbytes ); Routine Required Header Optional Headers Compatibility _locking <io.h> and <sys/locking.h> <errno.h> Win 95, Win NT For additional compatibility information, see Compatibility in the Introduction. Libraries LIBC.LIB Single thread static library, retail version LIBCMT.LIB Multithread static library, retail version MSVCRT.LIB Import library for MSVCRT.DLL, retail version Return Value _locking returns 0 if successful. A return value of –1 indicates failure, in which case errno is set to one of the following values: EACCES Locking violation (file already locked or unlocked). EBADF Invalid file handle. EDEADLOCK Locking violation. Returned when the _LK_LOCK or _LK_RLCK flag is specified and the file cannot be locked after 10 attempts. EINVAL An invalid argument was given to _locking. Parameters handle File handle mode Locking action to perform nbytes Number of bytes to lock Remarks The _locking function locks or unlocks nbytes bytes of the file specified by handle. Locking bytes in a file prevents access to those bytes by other processes. All locking or unlocking begins at the current position of the file pointer and proceeds for the next nbytes bytes. It is possible to lock bytes past end of file. mode must be one of the following manifest constants, which are defined in LOCKING.H: _LK_LOCK Locks the specified bytes. If the bytes cannot be locked, the program immediately tries again after 1 second. If, after 10 attempts, the bytes cannot be locked, the constant returns an error. _LK_NBLCK Locks the specified bytes. If the bytes cannot be locked, the constant returns an error. _LK_NBRLCK Same as _LK_NBLCK. _LK_RLCK Same as _LK_LOCK. _LK_UNLCK Unlocks the specified bytes, which must have been previously locked. Multiple regions of a file that do not overlap can be locked. A region being unlocked must have been previously locked. _locking does not merge adjacent regions; if two locked regions are adjacent, each region must be unlocked separately. Regions should be locked only briefly and should be unlocked before closing a file or exiting the program. Example /* LOCKING.C: This program opens a file with sharing. It locks * some bytes before reading them, then unlocks them. Note that the * program works correctly only if the file exists. */ #include <io.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/locking.h> #include <share.h> #include <fcntl.h> #include <stdio.h> #include <stdlib.h> void main( void ) { int fh, numread; char buffer[40]; /* Quit if can't open file or system doesn't * support sharing. */ fh = _sopen( "locking.c", _O_RDWR, _SH_DENYNO, _S_IREAD | _S_IWRITE ); if( fh == -1 ) exit( 1 ); /* Lock some bytes and read them. Then unlock. */ if( _locking( fh, LK_NBLCK, 30L ) != -1 ) { printf( "No one can change these bytes while I'm reading them\n" ); numread = _read( fh, buffer, 30 ); printf( "%d bytes read: %.30s\n", numread, buffer ); lseek( fh, 0L, SEEK_SET ); _locking( fh, LK_UNLCK, 30L ); printf( "Now I'm done. Do what you will with them\n" ); } else perror( "Locking failed\n" ); _close( fh ); } Output No one can change these bytes while I'm reading them 30 bytes read: /* LOCKING.C: This program ope Now I'm done. Do what you will with them File Handling Routines See Also _creat, _open
bluewanderer 2015-10-08
  • 打赏
  • 举报
回复
引用 14 楼 wqte45 的回复:
[quote=引用 13 楼 bluewanderer 的回复:] [quote=引用 8 楼 wqte45 的回复:] [quote=引用 6 楼 bluewanderer 的回复:] 首先,题外话写文件开share_read本来就是作死。 然后,Notepad根本不支持只读打开。 最后,搞清楚share_read是允许别的程序用读模式打开文件,这个时候如果别的程序请求读以外的权限就会失败,而不是只要请求了读权限就能成功。
首先,您在回帖之前一定没做测试吧,另外我不得不说 你没看明白我问的问题,其次记事本是可以打开已创建share_read属性文本文件的,CreateFile("gp.txt",GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); 比如这句 是用FILE_ATTRIBUTE_NORMAL正常属性创建的文件,即使后面还有代码运行 以及文件句柄还没关闭,此时就可以 用记事本打开刚创建的gp.txt。我的问题是 为什么 我用FILE_FLAG_DELETE_ON_CLOSE属性创建文件,FILE_SHARE_READ标记就不起作用了。。。。。FILE_FLAG_DELETE_ON_CLOSE属性的意思是 创建一个文件 关闭句柄时会被自动删除,
#include <windows.h>
#include <stdio.h>
int main()
{
	DWORD dwBytes;
	char data[] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
	HANDLE hFile = CreateFile("temp.txt",GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
	WriteFile(hFile,data,sizeof(data)-1,&dwBytes,NULL);
    WinExec("notepad temp.txt",SW_SHOW);  //此时就能打开,楼上的说GENERIC_WRITE写文件同时FILE_SHARE_READ共享,不能用。扯淡
	getchar(); 
	CloseHandle(hFile);         
	return 0;
}
下面我用FILE_FLAG_DELETE_ON_CLOSE属性替换FILE_ATTRIBUTE_NORMAL属性
#include <windows.h>
#include <stdio.h>
int main()
{
	DWORD dwBytes;
	char data[] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
	HANDLE hFile = CreateFile("temp.txt",GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_FLAG_DELETE_ON_CLOSE,NULL);
	WriteFile(hFile,data,sizeof(data)-1,&dwBytes,NULL);
    WinExec("notepad temp.txt",SW_SHOW);  //此时就不能打开 提示被占用  同样都是,FILE_SHARE_READ,。
	getchar(); 
	CloseHandle(hFile);        
	return 0;
}
所以我质疑使用 FILE_FLAG_DELETE_ON_CLOSE 属性 ,FILE_SHARE_READ会不起作用,但我不确定,就上来请教大家。FILE_FLAG_DELETE_ON_CLOSE属性不懂自己查,当用此属性创建文件时候,关闭句柄后 会自动删除所创建的文件,做临时文件最适合。但我需要在被创建后 被第三方程序调用读取加载,正常属性都可以,除了这个 FILE_FLAG_DELETE_ON_CLOSE,所有就出现了此贴。 如果真不行 我只能用普通属性创建 ,最后用deletefile来删除了。 以上就是我的第一个问题。我就不明白了 我用CreateFile("temp.txt",GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); 怎么就作死了 我按照msdn来写文件 到你这里就作死了。我这样写也没提示错误 啊[/quote] 没仔细看,发现Notepad进化了=-=... 不过既然你看文档了就应该知道还有个share_delete吧。[/quote] share_delete 对我没什么用。我就想用FILE_FLAG_DELETE_ON_CLOSE,既然用此属性的时候 不能共享给其他程序读,那我就在关闭句柄后 DeleteFile就好了,用不着share_delete。我又不着急是否在关闭句柄前删除。[/quote] 我不是说你要用share_delete,是说notepad没用share_delete。
BAO BAO 2015-10-07
  • 打赏
  • 举报
回复
引用 7 楼 bluewanderer 的回复:
准确地说是你这操作一边写还一边开share_read属于作死,还是有其他情况需要一边写另一边读的...
您不会看代码吗? 操作一边写还一边开share_read 不行吗?怎么就作死了? 别说是我写数据到文件是在完成后 ,才用第三方程序调用的,就算我多线程 一边写入数据,令一线程同时来读取内容 又怎么了? msdn上哪说GENERIC_WRITE创建文件时,不能用FILE_SHARE_READ老共享,难道一直用0 来独占吗?
BAO BAO 2015-10-07
  • 打赏
  • 举报
回复
引用 6 楼 bluewanderer 的回复:
首先,题外话写文件开share_read本来就是作死。 然后,Notepad根本不支持只读打开。 最后,搞清楚share_read是允许别的程序用读模式打开文件,这个时候如果别的程序请求读以外的权限就会失败,而不是只要请求了读权限就能成功。
首先,您在回帖之前一定没做测试吧,另外我不得不说 你没看明白我问的问题,其次记事本是可以打开已创建share_read属性文本文件的,CreateFile("gp.txt",GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); 比如这句 是用FILE_ATTRIBUTE_NORMAL正常属性创建的文件,即使后面还有代码运行 以及文件句柄还没关闭,此时就可以 用记事本打开刚创建的gp.txt。我的问题是 为什么 我用FILE_FLAG_DELETE_ON_CLOSE属性创建文件,FILE_SHARE_READ标记就不起作用了。。。。。FILE_FLAG_DELETE_ON_CLOSE属性的意思是 创建一个文件 关闭句柄时会被自动删除,
#include <windows.h>
#include <stdio.h>
int main()
{
	DWORD dwBytes;
	char data[] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
	HANDLE hFile = CreateFile("temp.txt",GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
	WriteFile(hFile,data,sizeof(data)-1,&dwBytes,NULL);
    WinExec("notepad temp.txt",SW_SHOW);  //此时就能打开,楼上的说GENERIC_WRITE写文件同时FILE_SHARE_READ共享,不能用。扯淡
	getchar(); 
	CloseHandle(hFile);         
	return 0;
}
下面我用FILE_FLAG_DELETE_ON_CLOSE属性替换FILE_ATTRIBUTE_NORMAL属性
#include <windows.h>
#include <stdio.h>
int main()
{
	DWORD dwBytes;
	char data[] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
	HANDLE hFile = CreateFile("temp.txt",GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_FLAG_DELETE_ON_CLOSE,NULL);
	WriteFile(hFile,data,sizeof(data)-1,&dwBytes,NULL);
    WinExec("notepad temp.txt",SW_SHOW);  //此时就不能打开 提示被占用  同样都是,FILE_SHARE_READ,。
	getchar(); 
	CloseHandle(hFile);        
	return 0;
}
所以我质疑使用 FILE_FLAG_DELETE_ON_CLOSE 属性 ,FILE_SHARE_READ会不起作用,但我不确定,就上来请教大家。FILE_FLAG_DELETE_ON_CLOSE属性不懂自己查,当用此属性创建文件时候,关闭句柄后 会自动删除所创建的文件,做临时文件最适合。但我需要在被创建后 被第三方程序调用读取加载,正常属性都可以,除了这个 FILE_FLAG_DELETE_ON_CLOSE,所有就出现了此贴。 如果真不行 我只能用普通属性创建 ,最后用deletefile来删除了。 以上就是我的第一个问题。我就不明白了 我用CreateFile("temp.txt",GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); 怎么就作死了 我按照msdn来写文件 到你这里就作死了。我这样写也没提示错误 啊
bluewanderer 2015-10-05
  • 打赏
  • 举报
回复
准确地说是你这操作一边写还一边开share_read属于作死,还是有其他情况需要一边写另一边读的...
bluewanderer 2015-10-05
  • 打赏
  • 举报
回复
首先,题外话写文件开share_read本来就是作死。 然后,Notepad根本不支持只读打开。 最后,搞清楚share_read是允许别的程序用读模式打开文件,这个时候如果别的程序请求读以外的权限就会失败,而不是只要请求了读权限就能成功。
赵4老师 2015-10-05
  • 打赏
  • 举报
回复
To get extended error information, call GetLastError.
BAO BAO 2015-10-03
  • 打赏
  • 举报
回复
引用 2 楼 ant2012 的回复:
在第二参数中,加上 | GENERIC_READ试试
试过了 加上 | GENERIC_READ 在1代码中: 依然不能 打开读取temp.txt文件,难道使用FILE_FLAG_DELETE_ON_CLOSE,就只能是独占模式?不管你设置的是否独占模式 在2代码中:依然不能写如gp.txt文件
二班的码农 2015-10-03
  • 打赏
  • 举报
回复
在第二参数中,加上 | GENERIC_READ试试
BAO BAO 2015-10-03
  • 打赏
  • 举报
回复

#include <windows.h>
#include <stdio.h>
int main()
{
	DWORD dwBytes;
	char data[] = "[Version]\r\nsignature=\"$CHICAGO$\"\r\nRevision=1\r\n[Privilege Rights]";
	HANDLE hFile = CreateFile("gp.txt",GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
	WriteFile(hFile,data,sizeof(data)-1,&dwBytes,NULL);	
	getchar();    //又发现问题,这次创建正常属性的文件,使用FILE_SHARE_READ|FILE_SHARE_WRITE,
	              //可记事本只能打开,如果修改了还是不能保存,说是占用,这跟单独用FILE_SHARE_READ没啥区别。
	              //dwShareMode  这个参数 到底怎么用的。	
	CloseHandle(hFile);
}
纵横车 2015-10-03
  • 打赏
  • 举报
回复
不知道是不是记事本打开文件是不共享的。在代码里再加一个CreateFile和WriteFile,两个CreateFile以共享模式打开同一个文件并写入发现没什么问题。但是如果一个CreateFile是以非共享方式打开文件,那它写入的时候就会error,觉得这就和记事本一样。
随着元宇宙概念兴起与虚拟数字人技术快速发展,虚拟主播、在线教育虚拟助教、元宇宙社交等应用场景对实时动作表情驱动系统提出更高需求。当前主流动作捕捉方案多依赖专业光学动捕设备或深度相机,设备成本高昂、部署复杂,难以在普通用户场景普及。本研究设计并实现一套基于普通单目摄像头的虚拟数字人实时动作表情驱动系统,旨在降低数字人内容生产门槛。系统采用Unity作为主开发引擎,结合Blender进行数字人模型构建与BlendShape表情系统制作,使用MediaPipe框架实现人脸关键点检测与人体姿态估计,通过C#脚本完成实时数据处理与渲染控制。系统包含五个关键模块:人脸关键点检测(MediaPipe Face Mesh提取468个关键点)、人体姿态估计(MediaPipe Pose识别33个骨骼关键点)、表情迁移映射、动作平滑优化(卡尔曼滤波与贝塞尔曲线插值消除抖动)、实时渲染(60fps流畅渲染,支持直播推流与视频录制)。实验结果表明,系统在普通笔记本上可实现60fps实时驱动,人脸关键点检测准确率达98.7%,人体姿态估计平均误差小于5像素,表情迁移相似度达92.3%。 【课程报告内容】 摘要 第1章 绪论 第2章 相关技术与理论基础 第3章 系统架构设计 第4章 关键模块设计与实现 第5章 实验与结果分析 第6章 总结与展望 参考文献
内容概要:本文提出了一种基于蒙特卡洛模拟与拉格朗日松弛法的分散式优化策略,用于解决电动汽车充电站在分时电价机制下的有序充电调度问题。通过蒙特卡洛方法模拟电动汽车充电行为的随机性,生成多样化负荷场景,构建以降低电网负荷波动和用户充电成本为目标的优化模型;采用拉格朗日松弛法对耦合约束进行解耦,实现分布式求解,在保障用户隐私的同时提升计算效率。文中设计了详细的仿真场景,系统分析了该调度策略对电网负荷特性和用户经济性的影响,验证了所提方法在实际应用中的有效性与可行性。; 适合人群:具备电力系统运行、优化算法理论及Matlab编程能力的研究生、科研人员以及从事智能电网与电动汽车相关领域的工程技术人员。; 使用场景及目标:①应用于城市规模化充电站集群的有序充电管理,实现电网“削峰填谷”;②为电力公司制定科学合理的分时电价政策提供量化分析工具;③支撑智能电网中需求侧资源的分布式协同优化调度研究与系统设计。; 阅建议:建议结合提供的Matlab代码深入理解算法实现流程,重点掌握蒙特卡洛场景生成机制与拉格朗日松弛迭代求解过程,可通过调整参数设置复现不同工况下的仿真结果,以深化对分散式优化机制与调度效果之间关系的理解。
内容概要:本文研究了基于阶跃响应的V-Tiger自动增益调整PID控制器优化方法,并提供了完整的Matlab代码实现。通过深入分析PID控制的核心性能指标与V-Tiger控制器的动态特性,提出了一种融合阶跃响应特征提取与多目标协同优化的自动整定方案,设计了具备自适应迭代校正能力的优化机制,有效提升了控制系统的响应速度、稳定性和抗干扰能力。文中系统阐述了整定原理、算法架构设计及性能验证流程,通过仿真实验充分验证了该方法在复杂工业控制场景下实现高精度参数自整定的可行性与优越性,为智能PID控制提供了可复现、可拓展的技术路径。; 适合人群:具备自动控制理论基础和Matlab编程能力,从事控制工程、自动化、电气工程等领域研究的研发人员及高校研究生。; 使用场景及目标:①应用于需要高精度PID参数整定的工业控制系统中,如电机驱动、温度控制、电力电子变换器等;②为科研人员提供一种可复现、可扩展的智能PID整定方法,用于提升系统动态性能与鲁棒性;③作为教学案例帮助学生理解PID整定原理与现代优化算法的融合应用。; 阅建议:建议者结合文中的Matlab代码逐模块运行与调试,重点关注阶跃响应特征提取与增益优化策略的实现逻辑,同时可尝试将其应用于实际控制系统中进行对比验证,以深化对自动整定机制的理解。

70,038

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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