windows 32位的程序调用64位的程序吗

windows 32位的程序调用64位的程序吗,第1张

工作流程:

1创建一个进程外COM服务器(EXE)。

2将32位dll的接口函数封装为COM服务器的相关接口。

3注册COM服务器exe /regserver  (注销 exe /unregserver)。

464位进程调用32位COM服务器接口,成功。从而曲线实现了64位进程调用32位dll。

具体步骤:

我首先创建了一个简单的dll工程,只输出一个函数int c = add(int a,int b); 生成lib和dll

然后创建一个进程外COM(EXE类型),内部链接dll,添加方法Method: Add(long c)

{ c = add(1,2);}编译生成。

然后注册COM,exe /regserver

最创建一个64位WIN32工程验证64位环境下方法调用是否正确,经验证正确!!!

结论:以上方法可以解决64位进程调用32位dll的问题

32位进程调用64位dll应该也可以通过这种方法解决,原因64位windows系统下安装了32位和64位两套COM系统

如果需要C#版的,可以看下我之前写的:C#如何获取其他程序ListView控件中的内容

获取其他进程的数据需要使用到以下几个函数:

VirtualAllocEx()

VirtualFreeEx()

WriteProcessMemory()

ReadProcessMemory()

以获取任务管理器中的进程列表为例,运行结果如下:

关键代码

HANDLE hProcess;

LVITEM pointer;

HWND hwnd,hListview;

int headerhwnd; //listview控件的列头句柄

int rows,cols; //listview控件中的行列数

DWORD ProcessID = NULL;

DWORD ThreadID = NULL;

hwnd = (HWND)::FindWindow(_T("#32770") , _T("Windows 任务管理器"));

hwnd = (HWND)::FindWindowEx(hwnd, 0, _T("#32770") , NULL );

//进程界面窗口的句柄,通过SPY获取

hListview = (HWND)::FindWindowEx(hwnd, 0, _T("SysListView32") , NULL );

//listview的列头句柄

headerhwnd = ::SendMessage(hListview, LVM_GETHEADER, 0, 0);

//总行数:进程的数量

rows = ::SendMessage(hListview,LVM_GETITEMCOUNT,0,0);

//列表列数

cols = ::SendMessage(hListview, HDM_GETITEMCOUNT,0,0);

ThreadID = GetWindowThreadProcessId(hListview,&ProcessID);

//打开并插入进程

hProcess = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE|PROCESS_QUERY_INFORMATION, FALSE,ProcessID);

//申请代码的内存区

pointer = (LVITEM)VirtualAllocEx(hProcess,NULL, sizeof(LVITEM),MEM_COMMIT, PAGE_READWRITE);

for (int i = 0; i < rows;i++ )

{

m_ProcessListInsertItem(i,_T(""));

for (int j = 0; j < cols;j++ )

{

LVITEM vItem;

vItemmask = LVIF_TEXT; //说明pszText是有效的

vItemiItem = i; //行号

vItemiSubItem = j; //列号

vItemcchTextMax = 512; //所能存储的最大的文本为256字节

LPWSTR pItem = NULL;

//申请内存空间

pItem = (LPWSTR)VirtualAllocEx(hProcess, NULL, 512, MEM_COMMIT, PAGE_READWRITE);

vItempszText = pItem;

WriteProcessMemory( hProcess , pointer , &vItem , sizeof(LVITEM),NULL);

::SendMessage(hListview, LVM_GETITEMW,(WPARAM)i,(LPARAM)pointer);

char ItemBuf[512];

memset(ItemBuf,0,512);

ReadProcessMemory(hProcess, pItem, ItemBuf, 512, NULL);

CString str;

strFormat(_T("%s"),ItemBuf);

m_ProcessListSetItemText(i,j,str);

//释放内存空间

VirtualFreeEx(hProcess, pItem, 0, MEM_RELEASE);

}

}

//释放内存空间

VirtualFreeEx(hProcess, pointer, 0, MEM_RELEASE);//在其它进程中释放申请的虚拟内存空间,MEM_RELEASE方式很彻底,完全回收

CloseHandle(hProcess);//关闭打开的进程对象

没事做,写个详细代码给你吧

#include<windowsh>

#include<tlhelp32h>//声明快照函数的头文件

int main(int argc,char argv[])

{

PROCESSENTRY32 pe32;

//在使用这个结构之前,先设置它的大小

pe32dwSize=sizeof(pe32);

//给系统内的所有进程拍一个快照

HANDLE hProcessSnap=::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);

//遍历进程快照,轮流显示每个进程的信息

BOOL bMore=::Process32First(hProcessSnap,&pe32);

while(bMore)

{

if(strcmp("abcexe",pe32szExeFile)==0)//如果找到进程名为abcexe

{

HANDLE hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,pe32th32ProcessID);//获取句柄

/这里已经打开那个进程的句柄了/ }

bMore=::Process32Next(hProcessSnap,&pe32);//寻找下一个

}

return 0;

}

首先,如果你使用的是64位的电脑,你可以尝试直接运行一下你的exe文件,然后打开任务管理器,一般来说进程信息后面标有32位(32bit)字样的都是32位的应用程序;而如果没有标记的,则不能判断是32位的还是64位的,只能说是64位程序的可能性更大。

如果你使用的是32位的电脑,则可以运行的程序一定是32位的;而不可以运行的程序可能是64位的,也可能是程序存在问题或系统存在问题导致不能运行。

可以看出上面的办法并不十分可靠。

所以我们可以通过更直接的办法来判断。

打开windows自带的“记事本”,并使用记事本直接打开你的exe文件。一定会出现一堆乱码。不要着急,只要看第二行即可,第二行开头不远处有PE两个字母,再后面两个空格后第三个字符就是标记了,如果是字母L的话,就是32位应用程序,如果是d就表示是64位应用程序。

如图,分别是32位程序和64位程序的截图。

3

还有如果有更高级的文本编辑器,比如Notepad++或者我使用的NotePad2之类的,直接打开exe文件可以显示出“不可打印的字符”,我们看到第三行那个PE后面跟了两个NUL就是空字符的意思,后面的字符就是标记了,还是一样的,L表示32位,d表示64位。

//判断 *** 作系统是64位还是32位//返回TRUE位64位,返回FALSE位32位///////////////////////////////////////////////////////////////////////////////////////方法一:BOOL IsWow64(){typedef BOOL (WINAPI LPFN_ISWOW64PROCESS) (HANDLE, PBOOL);LPFN_ISWOW64PROCESS fnIsWow64Process;BOOL bIsWow64 = FALSE;fnIsWow64Process = (LPFN_ISWOW64PROCESS)GetProcAddress( GetModuleHandle("kernel32"),"IsWow64Process");if (NULL != fnIsWow64Process){fnIsWow64Process(GetCurrentProcess(),&bIsWow64);}return bIsWow64;}方法二:BOOL GetOSVerIs64Bit(){BOOL bRet=FALSE;SYSTEM_INFO si;typedef VOID(__stdcallGETNATIVESYSTEMINFO)(LPSYSTEM_INFO lpSystemInfo);GETNATIVESYSTEMINFO fnGetNativeSystemInfo;fnGetNativeSystemInfo=(GETNATIVESYSTEMINFO)GetProcAddress(GetModuleHandle(TEXT("kernel32dll")),"GetNativeSystemInfo");if (fnGetNativeSystemInfo!=NULL){fnGetNativeSystemInfo(&si);if (siwProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64 ||siwProcessorArchitecture == PROCESSOR_ARCHITECTURE_IA64 ){bRet=TRUE;}}return bRet;}////////////////////////////////////////////////////////////////////////////////判断进程是64位还是32位//返回1为64位,返回0为32位////////////////////////////////////////////////////////////////////////////////

以上就是关于windows 32位的程序调用64位的程序吗全部的内容,包括:windows 32位的程序调用64位的程序吗、怎么在64位系统上用sendmessage发送消息获得listview控件的item信息、C++ 如何获取指定 进程名 的 进程ID 如:获取进程列表中 360tray.exe 的进程ID···等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9733833.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存