DLL sendMessage 给EXE

PcrazyC 2011-02-16 11:25:46
我写了一个DLL,当触发DLL界面上的事件后,会给EXE发送一个字符串,使用传地址的方式传过去,总提示可能堆被损坏。很奇怪,不知道如何解决。。。
...全文
243 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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
  • 打赏
  • 举报
回复
若不是一个进程,该怎么传呢? 我现在没办法,先用个简单的方法,写文件传的。暂时对效率要求不高,期待好方法。

16,548

社区成员

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

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

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