DLL sendMessage 给EXE

PcrazyC 2011-02-16 11:25:46
我写了一个DLL,当触发DLL界面上的事件后,会给EXE发送一个字符串,使用传地址的方式传过去,总提示可能堆被损坏。很奇怪,不知道如何解决。。。
...全文
268 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
Simao 2011-02-16
  • 打赏
  • 举报
回复
改成static wchar_t *origString = L"Hello,World"; 试试
Torch009 2011-02-16
  • 打赏
  • 举报
回复
SendMessage一个COPY_DATA消息吧
nicklisir 2011-02-16
  • 打赏
  • 举报
回复
一般是你的地址失效了,线程退出比你exe获取快;
你在sendmessage之后加sleep;时间调大点;如果不出问题就是了
jackson35296 2011-02-16
  • 打赏
  • 举报
回复
dll和exe是一个进程吗?如果不是一个进程,用WM_COPYDATA消息去传递。如果是一个进程,要注意传递完地址之后,指针指向的内容是不是已经析构了?
PcrazyC 2011-02-16
  • 打赏
  • 举报
回复
代码在内网,不好传
PcrazyC 2011-02-16
  • 打赏
  • 举报
回复
用的sendMessage,处理的时候字符串没有释放,调试的时候跟踪没问题的
stonewater 2011-02-16
  • 打赏
  • 举报
回复
传送和处理的代码都贴出来看看,
还有你是不是用的postmessage,可能处理的时候原有的字符串已经释放了
PcrazyC 2011-02-16
  • 打赏
  • 举报
回复
调试的时候,得到的转换数据是对的,没有多空格之类的东西
PcrazyC 2011-02-16
  • 打赏
  • 举报
回复
但是将转换的那段代码注释掉就好了,传过来后的参数不用就没问题了,转换代码如下 :
wchar_t *origString = L"Hello,World"; 
wcout << origString << endl;

// Convert to a char*
size_t origsize = wcslen(origString) + 1;
const size_t newsize = 100;
size_t convertedChars = 0;
char CharString[newsize];
wcstombs_s(&convertedChars, CharString, origsize, origString , _TRUNCATE);

PcrazyC 2011-02-16
  • 打赏
  • 举报
回复
没有做什么特别操作,就是把字符串传给EXE后,将WCHAR_T *转换为char *而已
手机写程序 2011-02-16
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 pcrazyc 的回复:]
若不是一个进程,该怎么传呢? 我现在没办法,先用个简单的方法,写文件传的。暂时对效率要求不高,期待好方法。
[/Quote]

Using Data Copy

--------------------------------------------------------------------------------

The following example demonstrates how to send information between two applications using the WM_COPYDATA message.

The sending application displays a dialog box to the user which requests certain information. The application packages the information into a private data structure, includes a pointer to the structure in the COPYDATASTRUCT structure, and sends the information to the receiving application using the WM_COPYDATA message. The receiving application has a hidden window with the class name Disp32Class.

Hide Example

// ************ Globals ************
//
#define MYDISPLAY 1
typedef struct tagMYREC
{
char s1[80];
char s2[80];
DWORD n;
} MYREC;
COPYDATASTRUCT MyCDS;
MYREC MyRec;
HRESULT hResult;
BOOL CALLBACK InfoDlgProc( HWND, UINT, WPARAM, LPARAM );
// ************ Code fragment ****************
// Get data from user. InfoDlgProc stores the information in MyRec.
//
DialogBox( ghInstance, "InfoDlg", hWnd, (DLGPROC) InfoDlgProc );
//
// Copy data into structure to be passed via WM_COPYDATA.
// Also, we assume that truncation of the data is acceptable.
//
hResult = StringCbCopy( MyRec.s1, sizeof(MyRec.s1), szFirstName );
if (hResult != S_OK)
return False;
hResult = StringCbCopy( MyRec.s2, sizeof(MyRec.s2), szLastName );
if (hResult != S_OK)
return False;
MyRec.n = nAge;
//
// Fill the COPYDATA structure
//
MyCDS.dwData = MYPRINT; // function identifier
MyCDS.cbData = sizeof( MyRec ); // size of data
MyCDS.lpData = &MyRec; // data structure
//
// Call function, passing data in &MyCDS
//
hwDispatch = FindWindow( "Disp32Class", "Hidden Window" );
if( hwDispatch != NULL )
SendMessage( hwDispatch,
WM_COPYDATA,
(WPARAM)(HWND) hWnd,
(LPARAM) (LPVOID) &MyCDS );
else
MessageBox( hWnd, "Can't send WM_COPYDATA", "MyApp", MB_OK );
The receiving application has a hidden window which receives the information from WM_COPYDATA and displays it to the user.

Hide Example

// ************ Globals ************
//
#define MYDISPLAY 1
typedef struct tagMYREC
{
char s1[80];
char s2[80];
DWORD n;
} MYREC;
PCOPYDATASTRUCT pMyCDS;
void WINAPI MyDisplay( LPSTR, LPSTR, DWORD );
//
// ************ Code fragment ****************
//
case WM_COPYDATA:
pMyCDS = (PCOPYDATASTRUCT) lParam;
switch( pMyCDS->dwData )
{
case MYDISPLAY:
MyDisplay( (LPSTR) ((MYREC *)(pMyCDS->lpData))->s1,
(LPSTR) ((MYREC *)(pMyCDS->lpData))->s2,
(DWORD) ((MYREC *)(pMyCDS->lpData))->n );
}
break;
PcrazyC 2011-02-16
  • 打赏
  • 举报
回复
若不是一个进程,该怎么传呢? 我现在没办法,先用个简单的方法,写文件传的。暂时对效率要求不高,期待好方法。
立即关闭显示器,为听歌时保护显示器而做,好用而已。 ★ 安装说明 无需安装,解压缩到指定目录。 建议在'QuickLaunch'和'桌面'上各建一个快捷方式,方便使用。 ★ 使用说明 运行CloseMonitor.exe,要重新激活显示器,鼠标单双击或按任意键。 鼠标移动时仍然维持关闭状态,如果希望鼠标移动时屏幕点亮,删除CloseMonitorHook.dll 文件即可。 ★ 运行过程 程序运行1秒后关闭显示器。3秒内,显示器不能被打开,然后每分钟,程序尝试关闭显示器。 显示器点亮后的3秒内,程序被禁止再次启动。 在鼠标移动时屏幕会有闪动,如果大家有什么好的建议,请和我联系。 ★ 文件说明 CloseMonitor.exe 主程序,运行即可。 CloseMonitorHook.dll 动态链接库,处理键盘、鼠标消息。 自述文档.txt 本文件。 ★ 作者: ●⌒●┒ べ ★ 变更说明 [2003-2-19] 版本1.0 程序里调用了Windows API ::SendMessage(hwnd, WM_SYSCOMMAND, SC_MONITORPOWER, 2); [2003-3-30] 版本1.1 增加 对鼠标移动消息的屏蔽。 [2003-5-12] 版本1.2 增加 防止程序运行两个版本,防止鼠标不断的点击,重复运行导致屏幕始终黑暗一片 [2003-7-31] 版本1.3 增加 每分钟尝试关闭一次显示器,防止Windows内部激活显示器。同时禁用屏幕保护 [2003-10-28] 版本1.4 增加 计算机待机时程序自动退出。一为待机唤醒时显示器可以自动点亮,二为解决Win2000 待机唤醒功能与本程序的冲突 [2003-12-23] 版本1.5 增加 程序启动时把所有窗体最小化功能(除置顶的窗体),这是由于窗体在连续刷新时会激 活显示器。此举可以避免窗体刷新 [2005-1-14] 版本1.6 修改由于windows xp加sp2 引发兼容性问题,将 ::SendMessage(hwnd, WM_SYSCOMMAND, SC_MONITORPOWER, 2);更改为 ::SendMessage(GetForegroundWindow(), WM_SYSCOMMAND, SC_MONITORPOWER, 2); 网友提供。 [2005-5-22] 版本1.7 增加程序退出时激活显示器的功能,由陶松林(lstfun@126.com)提供帮助。

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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