由CreateFile打开的文件Handle,如何移动其指针呢?就是哪个对应C下面的seek函数?

annkie 2003-08-27 08:36:28
我不知道该怎么移动到指定的位置.
...全文
551 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
jishiping 2003-08-28
  • 打赏
  • 举报
回复
我没有这样的设备,不能测试。使用上面的方式打开时,不知道能不能读出之前写入的内容。
annkie 2003-08-28
  • 打赏
  • 举报
回复
HANDLE hUSB = CreateFile("\\\\.\\Geneusb0",
GENERIC_READ|GENERIC_WRITE,
0, //do not share
NULL,
OPEN_EXISTING,
0,
NULL);
仍然不行。
thanks.
jishiping 2003-08-28
  • 打赏
  • 举报
回复
我没有设备可以测试。你用上面的方法打开USB设备后,能够读出之前写入的数据吗?
pbMaster 2003-08-27
  • 打赏
  • 举报
回复
都是星星哦,专家集合
jishiping 2003-08-27
  • 打赏
  • 举报
回复
你可以使用读写方式打开USB设备,同时不共享,可能能够解决你的问题。
annkie 2003-08-27
  • 打赏
  • 举报
回复
谢谢季老大,我也有过这个想法,但我由于需要在usb之间通信,这样的话可能会发生并发事件,比如两边同时写数据(不是绝对同时,就是会在另外一边本来要读到正确数据的时候由于处理慢而被另外的写动作修改数据),我现在就是想同步数据,然后定义了自己发送的数据的格式.
第一二位用来同步用的.第一byte是可以被server,client自由写的,第二byte是设为1或0识别是client还是server.
可能一下说不清楚,我就是要实现自己定义通信协议,实现pc之间通过usb发送数据,我不知道还有什么更好的办法.
jishiping 2003-08-27
  • 打赏
  • 举报
回复
如果你的USB设备,不支持SetFilePointer的话,第一次读出的东西就应该是 helloworld.
第二次读出的就是 1(我估计你的USB设备,第二次打开写时,会清空上一次写入的数据)。
如果需要修改其中的数据,需要先读出所有的数据,然后修改读出的数据,再将修改后的数
据写到USB设备中。
annkie 2003-08-27
  • 打赏
  • 举报
回复
还是不行,奇怪的是加了这句后,变成了
helloworld
1

后面的东西清空了.
if (SetFilePointer(hUSB,offset,NULL,FILE_BEGIN)==0xFFFFFFFF)
ShowMessage(SysErrorMessage(GetLastError()));
annkie 2003-08-27
  • 打赏
  • 举报
回复
You cannot use the SetFilePointer function with a handle to a nonseeking device, such as a communications device.
刚查了msdn,说是不能用在这这种设备上.
你指出的问题可能是主要原因,我试试看.
先谢了.
jishiping 2003-08-27
  • 打赏
  • 举报
回复
从你的代码的运行结果来看,对于你的USB设备,SetFilePointer好像不起作用。你可以判断
一下SetFilePointer的返回值,看看这个函数是否成功。这个函数返回0xFFFFFFFF,表示失败。
if (SetFilePointer(hUSB,offset,NULL,FILE_BEGIN)==0xFFFFFFFF)
ShowMessage(SysErrorMessage(GetLastError()));
jishiping 2003-08-27
  • 打赏
  • 举报
回复
USB 设备的读写,没有做过。不知道会怎样。但是你的程序中存在一些问题。
b = ReadFromUSB(pszBuffer,strlen(pData));
Memo1->Lines->Add(pszBuffer);
读出来的数据,后面没有添加字符0(读之前也没有将pszBuffer清为0),直接作为字符串
处理,是要出问题的,就象你看到的第二行,是乱码,就是这个原因造成的。
annkie 2003-08-27
  • 打赏
  • 举报
回复
bool __stdcall WriteToUSB(const char *strData,int offset)
{

//打开设备
HANDLE hUSB = CreateFile("\\\\.\\Geneusb0",
GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
0,
NULL);

if(hUSB == INVALID_HANDLE_VALUE)
{
::MessageBox(0,"打开USB设备失败!","Error",MB_OK|MB_ICONERROR);
return false;
}

DWORD nBytesWritten = 0;
SetFilePointer (hUSB,offset, NULL, FILE_BEGIN);
bool bResult = WriteFile(hUSB,
strData,
strlen(strData),
&nBytesWritten,
(LPOVERLAPPED)0);

CloseHandle(hUSB);
return bResult;
}
//-----------------------------------------------------------------
bool __stdcall ReadFromUSB(char *pszBuffer,long int nBytesToRead)
{
//打开设备
HANDLE hUSB = CreateFile("\\\\.\\Geneusb0",
GENERIC_READ,
0, //do not share
NULL,
OPEN_EXISTING,
0,
NULL);

if(hUSB == INVALID_HANDLE_VALUE)
{
::MessageBox(0,"打开USB设备失败!","Error",MB_OK|MB_ICONERROR);
return false;
}
DWORD nBytesRead = 0;
const long int BUFFERSIZE = 1024;
char strData[BUFFERSIZE];
bool bResult = ReadFile(hUSB,
&strData,
nBytesToRead,
&nBytesRead,
(LPOVERLAPPED)0);
CloseHandle(hUSB);
strncpy(pszBuffer,strData,nBytesToRead);
return bResult;
}
//------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
char pszBuffer[1024];
const char *pData = "helloworld.";
bool b;
b = WriteToUSB(pData,0);
b = ReadFromUSB(pszBuffer,strlen(pData));
Memo1->Lines->Add(pszBuffer);
b = WriteToUSB("1",strlen(pData)-3);
b = ReadFromUSB(pszBuffer,strlen(pData));
Memo1->Lines->Add(pszBuffer);

}
//---------------------------------------------------------------------------
结果是
helloworld.
1碛wpO謜

帮忙看一下,谢谢了
jishiping 2003-08-27
  • 打赏
  • 举报
回复
FileSeek 是BCB的函数,SetFilePointer 是API函数。“没有反应”是你用法不对。比如:
SetFilePointer(hFile, nPos, NULL, FILE_BEGIN); // nPos 是指文件的绝对位置。
jishiping 2003-08-27
  • 打赏
  • 举报
回复
int __fastcall FileSeek(int Handle, int Offset, int Origin);
__int64 __fastcall FileSeek(int Handle, const __int64 Offset, int Origin);

参数 int Origin 的含义,和C函数相同,分别为:0(开始位置),1(当前位置),
2(文件末尾)。
annkie 2003-08-27
  • 打赏
  • 举报
回复
谢谢,可是还是没有反应
zjy6631 2003-08-27
  • 打赏
  • 举报
回复
同意乡下人
halibut 2003-08-27
  • 打赏
  • 举报
回复
SetFilePointer(hFile,0/*低双字*/,0/*高双字*/,FILE_BEGIN);
SetFilePointer(hFile,0/*低双字*/,0/*高双字*/,FILE_CURRENT);
SetFilePointer(hFile,0/*低双字*/,0/*高双字*/,FILE_END);
halibut 2003-08-27
  • 打赏
  • 举报
回复
SetFilePointer()
annkie 2003-08-27
  • 打赏
  • 举报
回复
lseek((int)hUSB, offset, SEEK_SET);
没有反应,还是在最开头.

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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