| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5312 人关注过本帖
标题:请高手帮助指教,为何OpenFileMapping失败 谢谢
只看楼主 加入收藏
xs100
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2010-4-18
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:10 
请高手帮助指教,为何OpenFileMapping失败 谢谢
编写了一个DLL,通过编译.
程序代码:
#define WIN32_LEAN_AND_MEAN 
#include <windows.h>
#include <stddef.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include "stdafx.h"
#include   "time.h"  
#define MY_EXPFUNC __declspec(dllexport)

#include <iostream> //内存映射用
//+------------------------------------------------------------------+
char  *m=new char [10] ;// ok
char  *n=new char [10] ;// 
char  y[1];//   
char  y2[10];
char  y3[50]="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
//=====================================================================================================
MY_EXPFUNC char* __stdcall Set(char *xx)  //传入____ "AAAAAA" ;   
{
    m=NULL;
    strcpy(n,y3);//"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
//          m=n;//---------------------------//
    return(n); 
}               
//=====================================================================================================
  MY_EXPFUNC   char* __stdcall  SSend()//数据发送  
{
    char* lpData = NULL;
    HANDLE m_hFileMMF;      //
    BOOL UpdateData(TRUE);// 更新数据.
    m_hFileMMF=CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0,4*1024,"my_my");  
    //    m_hFileMMF=CreateFileMapping((HANDLE)0xFFFFFFFF,NULL,PAGE_READWRITE,0,0,0); 
    if(NULL==m_hFileMMF)  
    {  
        return("01--函数CreateFileMapping创建共享内存失败---返回值是NULL");//
    }
    lpData=(char*)MapViewOfFile(m_hFileMMF,FILE_MAP_WRITE,0,0,0);  
    if(NULL==lpData)  
    {  
        return("03--函数MapViewOfFile映射到地址空间失败---返回值是NULL");
    }
    CopyMemory(lpData,n,4*1024);
    UnmapViewOfFile(lpData);     

       lpData = NULL; 
       CloseHandle(m_hFileMMF);
          return("数据发送-----ok");//
}
//=====================================================================================================
MY_EXPFUNC   char* __stdcall RRecieve()//数据接收 
{
   
    HANDLE hMapping;
    char* lpccData;
    lpccData=NULL;
    HANDLE m_pViewMMFFile;
    m_pViewMMFFile= OpenFileMapping(FILE_MAP_ALL_ACCESS,0,"my_my"); 
    if(NULL==m_pViewMMFFile)  //
    {  
        return("06--函数OpenFileMapping失败---返回值是NULL");
    }
          lpccData=(char*)MapViewOfFile(m_pViewMMFFile,FILE_MAP_ALL_ACCESS,0,0,0);  
          if(NULL==lpccData)  
          {  
              return("08--函数MapViewOfFile失败---返回值是NULL");
          }
          m = lpccData;   
         
          UnmapViewOfFile(lpccData);   
         
          lpccData=NULL;
         
          CloseHandle(m_pViewMMFFile);// //
          return("数据接收-----ok");//
} 
//=====================================================================================================
MY_EXPFUNC   char* __stdcall Get(char *zz, const int vv)//传出"AAAAAAA"} ;  
{
    return(m);//
} 
//===============================
//===============================
请求帮助的DLL的包.rar (845.11 KB)

一共两个外部函数,两个内部函数。
一个函数传进《一串字符串》另一个函数是将传进的《一串字符串》,再原封不动传出去;
内部两个函数为内存文件映射之用,数据发送部份好象-----正常,能返回“ return("数据发送-----ok");// ”,
数据接收部份目前不正常:返回return("06--函数OpenFileMapping失败---返回值是NULL");
    好象----函数OpenFileMapping失败,代码需要修改,
请高手帮助指教,为何OpenFileMapping失败  谢谢
下附DLL代码和DLL的全套-dsw文件


[ 本帖最后由 xs100 于 2010-9-13 09:17 编辑 ]
搜索更多相关主题的帖子: 指教 失败 
2010-09-13 09:15
xs100
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2010-4-18
收藏
得分:0 
回复 楼主 xs100
目标很简单,只是为传出"AAAAAAA"一个字符串;
难度却很大?
2010-09-13 12:34
玩出来的代码
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:河南新乡
等 级:贵宾
威 望:11
帖 子:742
专家分:2989
注 册:2009-10-12
收藏
得分:20 
感觉你写的有点乱了,大致看一下你在创建文件映射对象后怎么又将此对象关闭了?那样OpenFileMapping肯定会出错的。。另外的两个小函数可以不写,你写到简单点测试下看看。

离恨恰如春草,更行更远还生。
2010-09-13 20:03
xs100
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2010-4-18
收藏
得分:0 
以下是引用玩出来的代码在2010-9-13 20:03:03的发言:

感觉你写的有点乱了,大致看一下你在创建文件映射对象后怎么又将此对象关闭了?那样OpenFileMapping肯定会出错的。。另外的两个小函数可以不写,你写到简单点测试下看看。
另外的两个小函数,是输入输出函数,必备的,
取消 lpData = NULL;和 CloseHandle(m_hFileMMF);这两行,
试了一下, return("08--函数MapViewOfFile失败---返回值是NULL");就移到08--函数MapViewOfFile失败了,另外DLL还会崩盘,不知如何是好???
谢谢您的帮助,

2010-09-13 21:50
玩出来的代码
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:河南新乡
等 级:贵宾
威 望:11
帖 子:742
专家分:2989
注 册:2009-10-12
收藏
得分:0 
就不在在DLL中测试了改成简单的将你的代码拆分开在两个实例间通信,原理都一样。你看看有没帮助。
这个相当于发送数据
程序代码:
#include <windows.h>
#include <stddef.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>

#include   "time.h"  

#include <iostream> //内存映射用

char  y3[50]="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
//=====================================================================================================
            
//=====================================================================================================
char* __stdcall  SSend()//数据发送 
{
    char* lpData = NULL;
    HANDLE m_hFileMMF;      //
    BOOL UpdateData(TRUE);// 更新数据.
    m_hFileMMF=CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0,4*1024,"my_my"); 
    //    m_hFileMMF=CreateFileMapping((HANDLE)0xFFFFFFFF,NULL,PAGE_READWRITE,0,0,0);
    if(NULL==m_hFileMMF) 
    { 
        return("01--函数CreateFileMapping创建共享内存失败---返回值是NULL");//
    }
    lpData=(char*)MapViewOfFile(m_hFileMMF,FILE_MAP_WRITE,0,0,0); 
    if(NULL==lpData) 
    { 
        return("03--函数MapViewOfFile映射到地址空间失败---返回值是NULL");
    }
    CopyMemory(lpData,y3,4*1024);
    UnmapViewOfFile(lpData);     

       lpData = NULL;
//       CloseHandle(m_hFileMMF);
          return("数据发送-----ok");//
}
//=====================================================================================================

int main()
{
    printf("%s\n",SSend());
    system("pause");
    return 0;
}
#include<stdio.h>
#include<windows.h>

char* __stdcall RRecieve()//数据接收
{
  
    char recv[80];
    char* lpccData;
    lpccData=NULL;
    HANDLE m_pViewMMFFile;
    m_pViewMMFFile= OpenFileMapping(FILE_MAP_ALL_ACCESS,0,"my_my");
    if(NULL==m_pViewMMFFile)  //
    { 
        return("06--函数OpenFileMapping失败---返回值是NULL");
    }
          lpccData=(char*)MapViewOfFile(m_pViewMMFFile,FILE_MAP_ALL_ACCESS,0,0,0); 
          if(NULL==lpccData) 
          { 
              return("08--函数MapViewOfFile失败---返回值是NULL");
          }
          CopyMemory(recv,lpccData,70);
          printf("%s\n",recv);
        
          UnmapViewOfFile(lpccData);  
        
          lpccData=NULL;
        
          CloseHandle(m_pViewMMFFile);// //
          return("数据接收-----ok");//
}
int main()
{
    printf("%s\n",RRecieve());
    system("pause");
    return 0;
}

 

离恨恰如春草,更行更远还生。
2010-09-14 10:53
xs100
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2010-4-18
收藏
得分:0 
非常谢谢,我先试一下..........
2010-09-14 11:13
xs100
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2010-4-18
收藏
得分:0 
...............................................

[ 本帖最后由 xs100 于 2010-9-14 14:00 编辑 ]
2010-09-14 11:53
东海一鱼
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:48
帖 子:757
专家分:4760
注 册:2009-8-10
收藏
得分:0 
玩代码地说的不错,如果加上读取同步机制就更好了。

举世而誉之而不加劝,举世而非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。彼其于世未数数然也。
2010-09-14 22:18
xs100
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2010-4-18
收藏
得分:0 
非常感谢<东海一鱼>和<玩出来>的大侠们的关注和帮助.
<<就不在DLL中测试了改成简单的将你的代码拆分开在两个实例间通信,原理都一样。你看看有没帮助。>>

不在DLL中测试了???我不理解?
我以上的代码在VC编译中是通过的,
是将DLL分别挂在了两个软件上测试的,所产生的"错误",已是实际反应了,.................
(等于分开在两个实例间通信,发送的只工作发送的代码,接收的只工作接收的代码)
看来好象是:
1.同步问题
2.同步问题解决后,好象还会有互斥问题等着,
(我有3个相类似的实例间通信演示(有APP的对话框),和完整的配套代码,
我是不需要有<对话框>的,但我水平有限不会有选择抄用和改用,
若去掉了<对话框>,同样会把有用的<同步机制和互斥机制>一同去掉了!!!
若有兴趣参考,我可传给您,请留  QQ ,Email)

请进一步指导为何,谢谢


[ 本帖最后由 xs100 于 2010-9-15 11:56 编辑 ]
2010-09-15 07:04
玩出来的代码
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:河南新乡
等 级:贵宾
威 望:11
帖 子:742
专家分:2989
注 册:2009-10-12
收藏
得分:0 
不在DLL中测试是为了简单点的在两个小程序中测试,你在VC中编译通过那你运行时
strcpy(n,y3);//"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";这句就没有引起崩溃...还是你本就没用到这句..

将DLL分别挂在两个软件上测试,,这两个软件是你自己写的?或者你用了某种方法来调用你的DLL中的函数?这个就先不说了
(等于分开在两个实例间通信,发送的只工作发送的代码,接收的只工作接收的代码)你是想要这种效果?

那样挂在两个软件上的DLL可以写的不同,只有Send工作或只有Recv工作就行了(不能相互通信)
同步互斥问题用信号量与互斥量就可以解决,以内存映射文件为共享缓冲区,用信号量代表资源(也就是发送到缓冲区的数据)的数量,另加上Mutex互斥访问就行了。这个看起来就像是生产者与消费者的问题了。

离恨恰如春草,更行更远还生。
2010-09-15 19:52
快速回复:请高手帮助指教,为何OpenFileMapping失败 谢谢
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.022745 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved