请问用什么方法能够把从vb中传到vc中的地址转化成指针?

ERT 2002-04-30 08:41:15
我想知道,我怎样把vb中一个结构(自定义的)的地址传到vc中,然后再vc中,又怎样把这个地址转化成结构指针来应用。
请帮帮忙呀?最好说详细一点?
...全文
84 25 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
harry202 2002-05-14
  • 打赏
  • 举报
回复
你的问题我觉得根本不需要用指针,传结构应该用VARIANT类型
zxs218 2002-05-14
  • 打赏
  • 举报
回复
zxs218@163.com
ERT 2002-05-13
  • 打赏
  • 举报
回复
to zxs218:
请给我一个你的信箱吧?
ERT 2002-05-13
  • 打赏
  • 举报
回复
to zxs218:

dwRead的作用是什么呀?我没有看出来?而且我也是过了,还是不行呀?
呵呵,谢谢了,多谢。
ERT 2002-05-10
  • 打赏
  • 举报
回复
对不起,我没有试验过您给我的程序,我看了您给我的程序,我感觉这些并不能解决我所面临的的问题,即使这个程序成功了,好像对我的程序的帮助不大呀?这个程序无法实现消息映射,vc部分的程序有怎样解决呢?说实话我是在做毕业设计,需要用到这些东西的,我想我因该已经向您说清楚了我的意图了吧。麻烦你了。
zxs218 2002-05-10
  • 打赏
  • 举报
回复
我知道你的问题了,因为不在同一个进程空间的缘故
建议你如此改一下:

long WINAPI SendMsg(UINT message,WPARAM wParam,LPARAM lParam)
{
HWND hWnd;
hWnd=::FindWindow(0,"HelloWorldDlg");
// 改为SendMessage,让它同步执行。
return SendMessage(hWnd,message,wParam,lParam);

}


ON_MESSAGE(WM_USER1,OnMsg)
void CHelloWorldDlgDlg::OnMsg(WPARAM wParam,LPARAM lParam)
{
Senddata senddata;
HANDLE hProcess = NULL;
DWORD dwRead;

// 找到发消息的窗口句柄
HWND hWnd = FindWindow(0, "你的VB窗口名称");

// 获得进程ID
DWORD dwProcessID;
GetWindowThreadProcessId(hWnd, &dwProcessID);
// 打开进程
hProcess = OpenProcess(PROCESS_VM_READ, FALSE,dwProcessID);
// 读数据
ReadProcessMemory(hProcess, (LPCVOID)lParam, &senddata, sizeof(Senddata), &dwRead);

switch(senddata.cbData)
{
case 1:
AfxMessageBox("xiaoxiyi");
break;
case 2:
AfxMessageBox("消息2");
break;
default:
AfxMessageBox("消息3");
break;
}
// 关闭句柄
CloseHandle(hProcess);
// WM_CLOSE 0x0010&H4A
// WM_COPYDATA 0x004A
}
Uninstall 2002-05-09
  • 打赏
  • 举报
回复
hWnd=::FindWindow(0,"HelloWorldDlg");

够呛,因为你的参数和使用参数的程序在不同的进程空间中。
zxs218 2002-05-09
  • 打赏
  • 举报
回复
我觉得vc的程序中始终不能识别到从vb程序中传送过来的结构

是可以的,我已经试过了,完全成功。

你可以试试我给你的代码。

我测试过了,可行。

VB代码:

Private Declare Sub SendMsg Lib "D:\Zhouxs\My Train Programs\TestDLL\Debug\TestDLL.dll" (ByVal data As Any)

Private Type Senddata
dwData As Long
cbData As Long
End Type

Private Sub Command1_Click()
Dim x As Senddata
x.cbData = 10
x.dwData = 20
SendMsg VarPtr(x)
End Sub

C++ DLL 代码:

#include "stdafx.h"
#include <stdio.h>

typedef struct _Tag_SendData
{
DWORD dwData;
long cdData;
} SendData;

BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
return TRUE;
}

void WINAPI SendMsg(SendData * pdata)
{
char Buffer[256];

sprintf(Buffer, "dwData = %d, cdData = %d", pdata->dwData, pdata->cdData);
MessageBox(NULL, Buffer, "", MB_OK);
}

; TestDLL.def : Declares the module parameters for the DLL.

LIBRARY "TestDLL"
DESCRIPTION 'TestDLL Dynamic Link Library'

EXPORTS
SendMsg

zxs218 2002-05-09
  • 打赏
  • 举报
回复
我觉得vc的程序中始终不能识别到从vb程序中传送过来的结构

是可以的,我已经试过了,完全成功。

你可以试试我给你的代码。
zxs218 2002-05-09
  • 打赏
  • 举报
回复
确保这一句执行正确吗?

hWnd=::FindWindow(0,"HelloWorldDlg");

建议你在这一句里增加测试语句。

long WINAPI SendMsg(UINT message,WPARAM wParam,LPARAM lParam)
{
SendData * pData = (SendData*)lParam;
char Buffer[256];

sprintf(Buffer, "dwData = %d, cdData = %d", pdata->dwData, pdata->cdData);
MessageBox(NULL, Buffer, "", MB_OK);

HWND hWnd;
hWnd=::FindWindow(0,"HelloWorldDlg");
return PostMessage(hWnd,message,wParam,lParam);

}
ERT 2002-05-09
  • 打赏
  • 举报
回复
to zxs218:
您帮我的修改的代码我试了,还是不行呀!我觉得vc的程序中始终不能识别到从vb程序中传送过来的结构。我编的的代码的目的是通过postsmessage()函数把vb中的消息以及所附带的数据,通过消息映射传送到vc的程序中去处理,正如我所给你的代码的意图是一样的。所以您是否就我的代码再给我一些意见呢?
zxs218 2002-05-09
  • 打赏
  • 举报
回复
你试过我下面的代码吗?我测试过了,没有问题。

实在不行,告知我的email地址。

VB代码:

Private Declare Sub SendMsg Lib "D:\Zhouxs\My Train Programs\TestDLL\Debug\TestDLL.dll" (ByVal data As Any)

Private Type Senddata
dwData As Long
cbData As Long
End Type

Private Sub Command1_Click()
Dim x As Senddata
x.cbData = 10
x.dwData = 20
SendMsg VarPtr(x)
End Sub

C++ DLL 代码:

#include "stdafx.h"
#include <stdio.h>

typedef struct _Tag_SendData
{
DWORD dwData;
long cdData;
} SendData;

BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
return TRUE;
}

void WINAPI SendMsg(SendData * pdata)
{
char Buffer[256];

sprintf(Buffer, "dwData = %d, cdData = %d", pdata->dwData, pdata->cdData);
MessageBox(NULL, Buffer, "", MB_OK);
}

; TestDLL.def : Declares the module parameters for the DLL.

LIBRARY "TestDLL"
DESCRIPTION 'TestDLL Dynamic Link Library'

EXPORTS
SendMsg
ERT 2002-05-09
  • 打赏
  • 举报
回复
to zxs218:
hWnd=::FindWindow(0,"HelloWorldDlg");
没有问题的,我已经成功传送了,WPARAM wParam,LPARAM lParam参数到vc程序中了,但只是限于long型。我没有办法用这LPARAM lParam参数去传送一个结构,因为这两个参数并不能满足我所传送的数据的需要。我觉得lParam应该能够传递结构指针的,可是怎么也办不到呀?所以才来问的,前面的hWnd虽然是在两个进程中,但是是可以使用的。
zxs218 2002-05-08
  • 打赏
  • 举报
回复
dim data as mystru

PostMessage hWnd, WM_USER+100, 0, varptr(data)
ERT 2002-05-08
  • 打赏
  • 举报
回复
您说的 mystru xx;
SendMessage(WM_USER+100, 0, (LONG)&xx);
我想在vb中实现,然后
case WM_USER+100:
{
mystru * pxx = (mystru *)lParam);
...
}
break;
在vc中实现,能不能行呀?vb部分怎么实现呀?


zxs218 2002-05-08
  • 打赏
  • 举报
回复
mystru xx;

SendMessage(WM_USER+100, 0, (LONG)&xx);

case WM_USER+100:
{
mystru * pxx = (mystru *)lParam);
...
}
break;
ERT 2002-05-08
  • 打赏
  • 举报
回复
可是在vc中怎样来接收这个指针呢?
我想通过sendmessage()来传递这个结构到vc中,在vc中怎样去接收这个机构的指针呢?
zxs218 2002-05-08
  • 打赏
  • 举报
回复
你的错误在这儿:

long _stdcall SendMsg(UINT message,WPARAM wParam,LPARAM lParam)
{
HWND hWnd;
hWnd=::FindWindow(0,"HelloWorldDlg");
return PostMessage(hWnd,message,wParam,lParam);

}

应为:

long WINAPI SendMsg(UINT message,WPARAM wParam,LPARAM lParam)
{
HWND hWnd;
hWnd=::FindWindow(0,"HelloWorldDlg");
return PostMessage(hWnd,message,wParam,lParam);

}

同时加上:
; mmm.def : Declares the module parameters for the DLL.

LIBRARY "mmm"
DESCRIPTION 'mmm Dynamic Link Library'

EXPORTS
SendMsg
zxs218 2002-05-08
  • 打赏
  • 举报
回复
我测试过了,可行。

VB代码:

Private Declare Sub SendMsg Lib "D:\Zhouxs\My Train Programs\TestDLL\Debug\TestDLL.dll" (ByVal data As Any)

Private Type Senddata
dwData As Long
cbData As Long
End Type

Private Sub Command1_Click()
Dim x As Senddata
x.cbData = 10
x.dwData = 20
SendMsg VarPtr(x)
End Sub

C++ DLL 代码:

#include "stdafx.h"
#include <stdio.h>

typedef struct _Tag_SendData
{
DWORD dwData;
long cdData;
} SendData;

BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
return TRUE;
}

void WINAPI SendMsg(SendData * pdata)
{
char Buffer[256];

sprintf(Buffer, "dwData = %d, cdData = %d", pdata->dwData, pdata->cdData);
MessageBox(NULL, Buffer, "", MB_OK);
}

; TestDLL.def : Declares the module parameters for the DLL.

LIBRARY "TestDLL"
DESCRIPTION 'TestDLL Dynamic Link Library'

EXPORTS
SendMsg
ERT 2002-05-08
  • 打赏
  • 举报
回复
to zxs218:
以下是我的程序的代码,是按照您的方法做的,但是还是不好行呀,请指教:
(vb部分代码如下)
Private Sub Command1_Click()

Dim lpsenddata As Senddata

lpsenddata.dwData = 1
lpsenddata.cbData = 1
call SendMsg(&H401, 1, VarPtr(lpsenddata))

module:
Public Declare Function RegisterWindowMessage Lib "user32" Alias "RegisterWindowMessageA" (ByVal lpString As String) As Long
Public Declare Function SendMsg Lib "C:\vc\file2\mmm\Debug\mmm" (ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Any) As Long

Public Type Senddata
dwData As Long
cbData As Long
End Type
(DLL代码如下)
long _stdcall SendMsg(UINT message,WPARAM wParam,LPARAM lParam)
{
HWND hWnd;
hWnd=::FindWindow(0,"HelloWorldDlg");
return PostMessage(hWnd,message,wParam,lParam);

}
(vc部分代码如下)
#define WM_USER1 0x0401
ON_MESSAGE(WM_USER1,OnMsg)
void CHelloWorldDlgDlg::OnMsg(WPARAM wParam,LPARAM lParam)
{
Senddata* lpsenddata;
lpsenddata=(Senddata *)lParam;

switch(lpsenddata->cbData)
{
case 1:
AfxMessageBox("xiaoxiyi");
break;
case 2:
AfxMessageBox("消息2");
break;
default:
AfxMessageBox("消息3");
break;
}
// WM_CLOSE 0x0010&H4A
// WM_COPYDATA 0x004A
}
加载更多回复(5)

16,548

社区成员

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

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

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