📄 subject_20308.htm
字号:
<p>
序号:20308 发表者:zl 发表日期:2002-11-05 14:30:19
<br>主题:CDMA2000 请进,还想请教你........
<br>内容:谢谢
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
回复者:CDMA2000 回复日期:2002-11-05 14:32:20
<br>内容:什么啊
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:zl 回复日期:2002-11-05 14:34:00
<br>内容:我打开了内存影射对象句柄,而且将他影射到了<BR>本地的进程中,即LPVOID lpBaseAddr = (LPVOID)MapViewofFile(hMapFile,....)<BR>但是当我读数据的时候就发生错误了?为什么哦?
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:zl 回复日期:2002-11-05 14:35:53
<br>内容:你说的没错 <BR>关键是由LPBASEADDR 这个地址 如何去读数据<BR>我读出的数据有错???
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:CDMA2000 回复日期:2002-11-05 14:36:06
<br>内容:什么错误啊,不会啊
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:zl 回复日期:2002-11-05 14:38:17
<br>内容:这个影射文件中存放的数据是连表结构<BR>但是当我按连表结构的形式读数据时就有问题了<BR>我发一段程序给你看看
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:CDMA2000 回复日期:2002-11-05 14:39:10
<br>内容:<BR>else if(GetLastError()==ERROR_ALREADY_EXISTS)<BR>{//这里访问内存映射<BR><BR>LPVOID lpMem=MapViewOfFile(hMap,FILE_MAP_WRITE,0);<BR>CString str=(char*)lpMem;//你可以按你的数据结构来访问,这里我映射的就是简单的字符<BR>UnmapViewOfFile(lpMem);<BR>如果你映射的你的结构数据比如YOUR_STUCT;<BR>那么就这样了<BR>YOUR_STUCT* p=(YOUR_STUCT*)lpMem;//<BR><BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:zl 回复日期:2002-11-05 14:40:17
<br>内容:<BR>WORD QueryPhrase(LPBYTE lpbKey,WORD wLen,LPKEYPH *lplpKeyPh)<BR>{<BR> WORD wHead,wCount=0,wMask=0;<BR> LPKEYPH lpKPh;<BR> int i;<BR> BYTE abKey[MAX_PHRASE_LEN+1];<BR> BOOL fFirst;<BR><BR> *lplpKeyPh = NULL;<BR> *(lplpKeyPh+1) = NULL;<BR><BR> if(wLen<1) return 0;<BR> <BR> wHead = (WORD)(*(lpbKey+1));<BR> wHead |= ((WORD)(*lpbKey & 0x01)) << 8;<BR> wHead--;<BR> <BR> for(i=0;i<wLen;i++)<BR> wMask += 1<<i;<BR><BR> for(i=0;i<2;i++){<BR> if( !(lpKPh=(LPKEYPH)((LPBYTE)lpMapFileBase+i*MAX_PY_NUM*sizeof(KEYPH))+wHead)->wLen ) {<BR> continue;<BR> }<BR><BR> fFirst = TRUE;<BR> do {<BR> if(wCount && *(lplpKeyPh+i) != NULL) break;<BR> <BR> if( fFirst ) fFirst = FALSE;<BR> else lpKPh = lpKPh->lpNext;<BR> <BR> if( lpKPh->wLen >= wLen){<BR> memcpy(abKey,lpKPh->abKey,wLen+1);<BR> abKey[0] &= wMask;<BR> if(!memcmp(abKey,lpbKey,wLen+1)){<BR> if(lpKPh->wLen == wLen) *(lplpKeyPh+i) = lpKPh;<BR> else wCount++;<BR> }<BR> }<BR> }while(lpKPh->lpNext != NULL);<BR> }<BR> return wCount;<BR>}<BR>其中的 KEYPH 是一个连表结构<BR>lpMapFileBase 就是内存影射文件的基地址<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:zl 回复日期:2002-11-05 14:42:31
<br>内容:你说的很对,我就是这样转换为自己的结构形式的<BR>错误就发生在这里 if( lpKPh->wLen >= wLen)<BR>我跟了一下 发现 lpKph->wLen 没有值<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:zl 回复日期:2002-11-05 14:44:28
<br>内容:难道是这个转换有错???<BR>LPKEYPH lpKPh;<BR><BR>lpKPh=(LPKEYPH)((LPBYTE)lpMapFileBase+i*MAX_PY_NUM*sizeof(KEYPH))+wHead ;
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:CDMA2000 回复日期:2002-11-05 14:46:41
<br>内容:这个也不好看出来!<BR>你现在是读映射,<BR>你确定你写映射后数据正确吗,还有你开的映射大小够不够呢
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:zl 回复日期:2002-11-05 14:49:22
<br>内容:如果我在本地进程中进行读操作很正常的<BR>就是在别的进程中访问是出错了<BR>我分配了 6 M 的空间,应该问题不大啊
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:zl 回复日期:2002-11-05 14:51:29
<br>内容:在另外的进程中使用 MapViewofFile<BR>是否得到了一模一样的文件副本呢?里面的数据一模一样???
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:zl 回复日期:2002-11-05 14:54:03
<br>内容:问:<BR> 在进程中调用 CreateFileMapping()<BR> 再 调用 lpBaseAddrNew = MapViewofFile()<BR> 这个lpBaseAddrNew 和原来的lpBaseAddr 是一样的值吗
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:CDMA2000 回复日期:2002-11-05 14:54:13
<br>内容:内存映射是可以跨进程的,我以前也写过,没有什么问题<BR>如果你操作正确,肯定是一个内存副本
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:CDMA2000 回复日期:2002-11-05 14:55:35
<br>内容:你可以先写一个简单一点的比如就读写字符的内存映射,<BR>在不同的进程试试,看能不能排除问题
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:zl 回复日期:2002-11-05 14:56:50
<br>内容:你能不能发一点源码给我,兄弟感激不尽啊
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:zl 回复日期:2002-11-05 15:05:08
<br>内容:我在书上也看到了类似的讨论:<BR> 我写给你看看,书上原话:<BR> 如果一个应用在内存影射文件中准备了连表,<BR> 然后与另一个进程共享此文件,有可能 在他的地址空间中完全不同的位置上影射这个文件,当第2进程要遍历连表时,他查到表中第1个<BR>元素,获得下一个元素内存地址,然后试图访问下一个元素,但是<BR> 对第2进程来说,第一个节点的下一个元素地址是不正确的!!!<BR><BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:zl 回复日期:2002-11-05 15:09:37
<br>内容:不管怎样还是要谢谢你!<BR>谢谢!!!
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:CDMA2000 回复日期:2002-11-05 15:12:15
<br>内容:对,有你说的那样的问题<BR>你可以先讲被映射的内存区内容全部复制到你程序中的一个内存区,<BR>然后这样间接访问,不要直接访问映射区<BR>你这样试试
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:zl 回复日期:2002-11-05 15:16:27
<br>内容:OK!<BR>要涉及到的内存函数大概有什么呢?
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:CDMA2000 回复日期:2002-11-05 15:18:37
<br>内容:就是内存复制啊比如,memcpy就可以啊<BR>复制到你的内存区后再进行转换<BR>你这样试试,也不一定行
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:zl 回复日期:2002-11-05 15:30:25
<br>内容:GOT IT ,Thanks a lot!
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:zl 回复日期:2002-11-05 16:06:26
<br>内容:我在书上也看到了类似的讨论:<BR> 我写给你看看,书上原话:<BR> 如果一个应用在内存影射文件中准备了连表,<BR> 然后与另一个进程共享此文件,有可能 在他的地址空间中完全不同的位置上影射这个文件,当第2进程要遍历连表时,他查到表中第1个<BR>元素,获得下一个元素内存地址,然后试图访问下一个元素,但是<BR> 对第2进程来说,第一个节点的下一个元素地址是不正确的!!!<BR><BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:John Lan 回复日期:2002-11-05 19:12:00
<br>内容:指针不能在mapping file里共享.
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -