共享内存DLL的问题!!--用于传递消息信息

angelcool 2005-03-31 11:31:22
我想将截获的消息再传递给调用程序,在DLL中设置了一个结构体作为共享数据段。
在DLL中如下定义:
#pragma data_seg("mydata")
struct ShareData
{
int g_nCode;
WPARAM g_wparam;
LPARAM g_lparam;
} ShareData;
struct ShareData sendMsg;
#pragma data_seg()

extern "C" {ShareData sendMsg;}

在DEF中如下声明:
EXPORTS
; Explicit exports can go here
ShareData CONSTANT
SECTIONS
mydata READ WRITE SHARED

编译出错:
error C2146: syntax error : missing ';' before identifier 'sendMsg'
error C2501: 'ShareData' : missing storage-class or type specifiers
error C2371: 'ShareData' : redefinition; different basic types
D:\MouseHook\MouseHook.cpp(27) : see declaration of 'ShareData'
fatal error C1004: unexpected end of file found Error executing cl.exe.

是什么问题???
或者有什么更好的办法可以传递这些消息。谢谢!!
...全文
690 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
gogowhy 2005-09-07
  • 打赏
  • 举报
回复
m
Ah 2005-04-04
  • 打赏
  • 举报
回复
写入的时候
ShareData *psd = (ShareData*) pszMySharedMapView;
psd->g_nCode = 1;
psd->g_wparam = 2;
psd->g_lparam = 3;

将这个地址(也就是ShareData的地址)传给接收数据的一方,在这里就是pszMySharedMapView

读取的时候
ShareData *psd = (ShareData*)pszMySharedMapView
int code = psd->g_ncode;
angelcool 2005-04-04
  • 打赏
  • 举报
回复
请参看
http://community.csdn.net/Expert/topic/3906/3906269.xml?temp=.3167383
angelcool 2005-04-04
  • 打赏
  • 举报
回复
怎样安全的传递指针呀???
huxzjqhh 2005-04-01
  • 打赏
  • 举报
回复
extern _export "C" {ShareData sendMsg;}

/////////////////
用WM_COPYDATA也很好
COPYDATASTRUCT cds;
char mem[1024];
cds.lpData=mem;
FindWindow();
SendMessage(hwnd,WM_COPYDATA,wParam,&cds);

angelcool 2005-04-01
  • 打赏
  • 举报
回复
to huxzjqhh(黑石)
除了消息传递,其他的方法我都没用过,
内存映射也看到,只是觉得内存共享似乎更简单。用什么都可以。


我在调用程序中直接引用了共享内存的值,但是好像都是空值。大概是值没有传过来。
调用程序中:
//与DLL的共享数据段
typedef struct ShareData
{
int g_nCode;
WPARAM g_wparam;
LPARAM g_lparam;
} ShareData;
extern "C" {ShareData sendMsg;}

LRESULT CASClientDlg::OnSendMsg()
{
int nCode = sendMsg.g_nCode;
......
}
跟踪发现它们的值都是0。
huxzjqhh 2005-04-01
  • 打赏
  • 举报
回复
怎么不用内存映射文件?
angelcool 2005-04-01
  • 打赏
  • 举报
回复
to huxzjqhh(黑石)
我就是想用共享内存,并且我也这样在DLL中设置了一块共享内存。
现在我不知道怎样去使用它。因为我查资料说不能直接引用。
--------------------
进程中使用该变量应注意间接引用。
m_pStatic=(CEdit*)GetDlgItem(IDC_SHARED);
m_pStatic->GetLine(0,*MySharedData,80);
--------------------

huxzjqhh 2005-04-01
  • 打赏
  • 举报
回复
可以用共享内存!
angelcool 2005-04-01
  • 打赏
  • 举报
回复
我把问题再总结一下:
1、在DLL中设置了共享内存,如何在调用程序中使用这些共享数据;
2、在DLL中给调用程序发送了一条消息,
SendMessage( m_hWnd, AS_SENDMSG, 0, 0);
但是调用程序好像没收到,没有反映!!
谢谢!!
帮顶也行,别让它沉下去了
angelcool 2005-04-01
  • 打赏
  • 举报
回复
在DLL中:
LRESULT WINAPI KeyboardProc(int nCode,WPARAM wparam,LPARAM lparam)
{
if (m_bOperator)
{
//创建一个名为MySharedMem的长度为4096字节的有名映射文件:
HANDLE hMySharedMapFile = CreateFileMapping(((HANDLE)0xFFFFFFFF), NULL,PAGE_READWRITE,0,0x1000,"mydata");

pszMySharedMapView = (LPSTR)MapViewOfFile(hMySharedMapFile, FILE_MAP_READ|FILE_MAP_WRITE,0,0,0);

PostMessage( m_hWndMain, AS_SENDMSG, 0, 0);
return CallNextHookEx(glhHook, nCode, wparam, lparam );//继续传递消息
}
else
return 1;

}

在调用程序中:
HANDLE hMySharedMapFile = OpenFileMapping(FILE_MAP_WRITE,FALSE,"mydata");
LPSTR pszMySharedMapView = (LPSTR)MapViewOfFile(hMySharedMapFile, FILE_MAP_READ|FILE_MAP_WRITE,0,0,0);
是这样就给它们建立了连接的通路,可以通过mydata这个文件视图传递数据??有什么问题吗?(我不知道怎样存数和取数,所以无法验证,只是编译通过)
那么,我接下来的问题是:
需要向mydata这个文件视图中添加数据并读取数据。
这个应该怎样做??
我没有这些资料。
angelcool 2005-04-01
  • 打赏
  • 举报
回复
是这样??好像挺有道理。那我就试试其他的吧!!

内存映射文件可以设定我自己的数据格式来传递吗?
应该怎样使用?最好能把步骤说清楚,DLL中需要什么,调用程序中需要什么?
多谢!
我也先试试!!
angelcool 2005-04-01
  • 打赏
  • 举报
回复
是这样??好像挺有道理。那我就试试其他的吧!!

内存映射文件可以设定我自己的数据格式来传递吗?
应该怎样使用?最好能把步骤说清楚,DLL中需要什么,调用程序中需要什么?
多谢!
我也先试试!!
hdqqq 2005-04-01
  • 打赏
  • 举报
回复
win32的程序,dll虽然对于所有的程序是共享的,但是dll中的变量,或者说dll中的数据,对于不同的进程来说是独立的,也就是说dll中的int 变量,对于不同的进程使用这个int 变量,数据是不同的.

我记得好像是这样的,所以你向要进行进程间通讯,最好使用其它办法.

象socket 或者内存映射文件,或者命名管道等.
angelcool 2005-04-01
  • 打赏
  • 举报
回复
LRESULT CASClientDlg::OnSendMsg()
{
int nCode = sendMsg.g_nCode;
_itoa( sendMsg.g_wparam, buffer, 10);
if( !FindWindow(0, "SendMSG") )
MessageBox(buffer,"SendMSG",MB_OK);
return 0L;
}
显示的值始终是0。
angelcool 2005-04-01
  • 打赏
  • 举报
回复
得到了,调试信息都能出来。就是得到的值不对。
LRESULT CASClientDlg::OnSendMsg()
{
int nCode = sendMsg.g_nCode;
if( !FindWindow(0, "SendMSG") )
MessageBox(buffer,"SendMSG",MB_OK);
return 0L;
}
感觉就只是在本程序中定义了sendMsg这么个变量,与DLL的共享内存就没关系。
oyljerry 2005-04-01
  • 打赏
  • 举报
回复
发送消息时,是否得到进程的句柄
angelcool 2005-04-01
  • 打赏
  • 举报
回复
我加上_export 就出下面的错:
nonstandard extension used : '_export' is an obsolete keyword, see documentation for __declspec(dllexport)

这几个方法都知道,只是我觉得共享内存的方法最直接,不需要其他的一些辅助变量。


我现在的问题是:在共享内存的数据并没有被传递,不知道是否哪里缺少了什么东西??
DLL程序中:
.DEF中
EXPORTS
; Explicit exports can go here
sendMsg CONSTANT
.CPP中
#pragma data_seg("mydata")
typedef struct ShareData
{
int g_nCode;
WPARAM g_wparam;
LPARAM g_lparam;
} ShareData;
ShareData sendMsg;
#pragma data_seg()

LRESULT WINAPI KeyboardProc(int nCode,WPARAM wparam,LPARAM lparam)
{
sendMsg.g_nCode = nCode;
sendMsg.g_lparam = lparam;
sendMsg.g_wparam = wparam;
if (nCode < 0)
{
return CallNextHookEx(glhHook,nCode,wparam,lparam);
}
if (nCode != HC_ACTION)
{
return CallNextHookEx(glhHook,nCode,wparam,lparam);
}
if (m_bOperator && !::FindWindow(0, "KeyBoard Locked"))
{
::MessageBox(0,buffer,"KeyBoard Locked",MB_OK);
}

if (m_bOperator)
{
PostMessage( m_hWndMain, AS_SENDMSG, 0, 0);
return CallNextHookEx(glhHook, nCode, wparam, lparam );//继续传递消息
}
else
return 1;

}

//在调用程序中:
typedef struct ShareData
{
int g_nCode;
WPARAM g_wparam;
LPARAM g_lparam;
} ShareData;
extern "C" {ShareData sendMsg;}

LRESULT CASClientDlg::OnSendMsg()
{
int nCode = sendMsg.g_nCode;
......
}
跟踪发现它们的值都是0。
angelcool 2005-03-31
  • 打赏
  • 举报
回复
编译出错:
error C2086: 'sendMsg' : redefinition
指向:
extern "C" {ShareData sendMsg;}
DentistryDoctor 2005-03-31
  • 打赏
  • 举报
回复
struct ShareData sendMsg;
=>
shareData sendMsg;
加载更多回复(9)

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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