使用WriteFile() GetLastError()的返回值是5,如何提升权限?谢谢

a3622041 2012-08-10 02:24:12
我自己写了1个OCX 然后再写了JS调用这个OCX来打开串口,但是发送数据需要使用WriteFile函数。结果数据发不出来,调试发现GetLastError返回值是5,拒绝访问,都说是权限不够。如何解决,再VC VB中使用这两个却没有问题。 来高人!!
ComHandle=CreateFile(Port,
GENERIC_READ||GENERIC_WRITE,
0,NULL,OPEN_EXISTING,NULL,NULL);
if(ComHandle==INVALID_HANDLE_VALUE){MessageBox("1"); return 0;}
char tmpP[11]="9600,n,8,1";//设置通讯参数
DCB dcb;
if(GetCommState(ComHandle,&dcb)==0){MessageBox("2");return -1;}
if(BuildCommDCB(tmpP,&dcb)==0){MessageBox("3");return -1;}
if(SetCommState(ComHandle,&dcb)==0){MessageBox("4");return -1;}
COMMTIMEOUTS TimeOuts;//设置超时时间
GetCommTimeouts(ComHandle,&TimeOuts);
TimeOuts.ReadIntervalTimeout=2000;
TimeOuts.ReadTotalTimeoutConstant=400;
TimeOuts.ReadTotalTimeoutMultiplier=400;
TimeOuts.WriteTotalTimeoutMultiplier=40;
TimeOuts.WriteTotalTimeoutConstant=400;
if(SetCommTimeouts(ComHandle,&TimeOuts)==0){MessageBox("6");return -2;}
if(SetupComm(ComHandle,2048,1024)==0){MessageBox("7");return -3;}//设置缓冲区
//PurgeComm(ComHandle,PURGE_RXABORT||PURGE_RXCLEAR);
//PurgeComm(ComHandle,PURGE_TXABORT||PURGE_TXCLEAR);
if(ComHandle<0){MessageBox("111");return 111;}
BYTE m_SendBuffer[1];
DWORD m_Number;
m_SendBuffer[0]=0x06;
if(WriteFile(ComHandle, m_SendBuffer, 1 , &m_Number,NULL)==0)
{
DWORD ErrorCode;
ErrorCode=GetLastError();
char temp[5];
sprintf(temp,"%d",ErrorCode);
MessageBox(temp);
MessageBox("here!");
return -5;
}
CloseHandle(ComHandle);
// Write();
MessageBox(Port);
return 0;
...全文
1117 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
盛世小码哥 2014-11-15
  • 打赏
  • 举报
回复
关键点1: 在Windows7系统中,对于已装载的逻辑磁盘中的扇区,不允许以物理方式改写,只能以逻辑盘形式打开改写,例如该扇区属于X:盘,则打开\\.\X:来改写。早期的操作系统没有这个限制。 关键点2: 你用WriteFile()写的文件对象要是文件所在的卷,并且要先锁定。写完之后要解锁,不能影响下次使用。ReadFile()貌似没有这方面的要求。
lcm2008lkl 2014-07-09
  • 打赏
  • 举报
回复
Win7下用管理员身份运行,OK。
zhangzhengmin 2012-08-14
  • 打赏
  • 举报
回复
怎么解决的? 我也碰到了
a3622041 2012-08-13
  • 打赏
  • 举报
回复
我自己解决了 谢谢了
a3622041 2012-08-13
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
楼主,请你无视2楼
[/Quote]
不行吗? 还是没办法解决啊
看不见的裂痕 2012-08-10
  • 打赏
  • 举报
回复
楼主,请你无视2楼
看不见的裂痕 2012-08-10
  • 打赏
  • 举报
回复
昨天也碰到个权限问题,看看这个

BOOL NSys::EnablePrivilege(TCHAR * name, BOOL fEnable, HANDLE hToken)
{
BOOL bRetVal;
int nError;
HANDLE hNewToken = NULL;
TOKEN_PRIVILEGES priv = { 1, {0, 0, fEnable ? SE_PRIVILEGE_ENABLED : 0} };

LookupPrivilegeValue(0, name, &priv.Privileges[0].Luid);
if(hToken == NULL)
OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hNewToken);
else
hNewToken = hToken;

bRetVal = AdjustTokenPrivileges(hNewToken, FALSE, &priv, sizeof(priv), 0, 0);
if(bRetVal == FALSE)
{
nError = ::GetLastError();
if(hToken == NULL)
CloseHandle(hNewToken);

::SetLastError(nError);
return FALSE;
}

if(hToken == NULL)
CloseHandle(hNewToken);
return TRUE;
}



程序启动时调用上面的函数, EnablePrivilege(SE_DEBUG_NAME, True, NULL)
Gloveing 2012-08-10
  • 打赏
  • 举报
回复
对JS的限制本来就会比较大,不然浏览器下载执行js代码隐患很大。。

3,248

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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