不可能吧。
#include "stdafx.h"
#include <stdio.h>
#include <conio.h>
#include <windows.h>int main(int argc, char* argv[])
{
HINSTANCE h=LoadLibrary("user32.dll");
printf("msgbox: %04lx\n\n",(ULONG)GetProcAddress(h,"MessageBoxA"));
printf("msgbox: %04lx\n\n",(ULONG)GetProcAddress(h,"MessageBoxA"));
printf("msgbox: %04lx\n\n",(ULONG)GetProcAddress(h,"MessageBoxA"));
getch();
FreeLibrary(h);
return 0;
}输出:
msgbox: bff541bamsgbox: bff541bamsgbox: bff541ba环境:Windows 98 4.10.2222,VC 6.0 Professional,Release。
#include "stdafx.h"
#include <stdio.h>
#include <conio.h>
#include <windows.h>int main(int argc, char* argv[])
{
HINSTANCE h=LoadLibrary("user32.dll");
printf("msgbox: %04lx\n\n",(ULONG)GetProcAddress(h,"MessageBoxA"));
printf("msgbox: %04lx\n\n",(ULONG)GetProcAddress(h,"MessageBoxA"));
printf("msgbox: %04lx\n\n",(ULONG)GetProcAddress(h,"MessageBoxA"));
getch();
FreeLibrary(h);
return 0;
}输出:
msgbox: bff541bamsgbox: bff541bamsgbox: bff541ba环境:Windows 98 4.10.2222,VC 6.0 Professional,Release。
解决方案 »
- 碰到一个很纠结的问题,关于弹出式菜单与鼠标双击的,大侠们帮帮忙
- DLL中函数的动态调用问题,请各位帮忙。
- 请问'sockaddr_storage'是在哪个头文件定义的?
- 一个关于CListCtrl的问题
- 是不是微软的HTML Help WorkShop 1.3 不能做搜索和书签功能?
- 我自己做了一个淡入淡出软件,但不知怎样计算在每台计算机下得到同样的每秒帧数?
- 很简单的数据库编程问题
- 关于win2k pro文件删除
- Pipe远程访问,CreateNamedPipe failed
- 纯软件实现电脑定时开、关机实现全自动化控制计算机
- 一个简单的问题,在MFC中如何实现自动化服务程序中的事件?
- 急、急。救兄弟一把
{
HINSTANCE h=LoadLibrary("user32.dll");
CString str;
str.Format("msgbox: %04lx\r\n",(ULONG)GetProcAddress(h,"MessageBoxA"));
Output(str);
str.Format("msgbox: %04lx\r\n",(ULONG)GetProcAddress(h,"MessageBoxA"));
Output(str);
str.Format("msgbox: %04lx\r\n",(ULONG)GetProcAddress(h,"MessageBoxA"));
Output(str);
}void CDllpDlg::Output(CString &str)
{
m_output.SetSel(-1);
m_output.ReplaceSel((LPCTSTR)str);
}
msgbox: 77e5d348
msgbox: 77e5d348
实在对不起,我搞错了,浪费你的时间和分数了,对不起!!呵呵
#include <stdio.h>
#include <conio.h>
#include <windows.h>int main(int argc, char* argv[])
{
HINSTANCE h=LoadLibrary("user32.dll");
printf("h: %04lx\n\n",(ULONG)h);
printf("1.msgbox: %04lx\n\n",(ULONG)GetProcAddress(h,"MessageBoxA"));
printf("1.msgbox: %04lx\n\n",(ULONG)GetProcAddress(h,"MessageBoxA"));
printf("1.msgbox: %04lx\n\n",(ULONG)GetProcAddress(h,"MessageBoxA")); printf("2.msgbox: %04lx\n\n",*(ULONG *)GetProcAddress(h,"MessageBoxA"));
printf("2.msgbox: %04lx\n\n",*(ULONG *)GetProcAddress(h,"MessageBoxA"));
printf("2.msgbox: %04lx\n\n",*(ULONG *)GetProcAddress(h,"MessageBoxA")); getch();
return 0;
}输出:h: bff500001.msgbox: 894c04801.msgbox: 894c04901.msgbox: 894c04a02.msgbox: f541ba682.msgbox: f541ba682.msgbox: f541ba68系统:Win98 4.10.2222 VC++6.0
--------------------------------------------------------
I have written a program like follow:#include "stdafx.h"
#include <stdio.h>
#include <conio.h>
#include <windows.h>int main(int argc, char* argv[])
{
HINSTANCE h=LoadLibrary("user32.dll");
printf("h: %04lx\n\n",(ULONG)h);
printf("1.msgbox: %04lx\n\n",(ULONG)GetProcAddress(h,"MessageBoxA"));
printf("1.msgbox: %04lx\n\n",(ULONG)GetProcAddress(h,"MessageBoxA"));
printf("1.msgbox: %04lx\n\n",(ULONG)GetProcAddress(h,"MessageBoxA")); printf("2.msgbox: %04lx\n\n",*(ULONG *)GetProcAddress(h,"MessageBoxA"));
printf("2.msgbox: %04lx\n\n",*(ULONG *)GetProcAddress(h,"MessageBoxA"));
printf("2.msgbox: %04lx\n\n",*(ULONG *)GetProcAddress(h,"MessageBoxA")); getch();
return 0;
}output:h: bff500001.msgbox: 894c04801.msgbox: 894c04901.msgbox: 894c04a02.msgbox: f541ba682.msgbox: f541ba682.msgbox: f541ba68my system:win98 4.10.2222 + VC++ 6can you tell me why the GetProcAddress function get different value every time
and it seems that the address which GetProcAddress point to contains the real pointer to dll function?
#include <stdio.h>
#include <conio.h>
#include <windows.h>int main(int argc, char* argv[])
{
HINSTANCE h=LoadLibrary("shell32.dll");
printf("h: %04lx\n\n",(ULONG)h);
printf("1.msgbox: %04lx\n\n",(ULONG)GetProcAddress(h,"ShellAboutA"));
printf("1.msgbox: %04lx\n\n",(ULONG)GetProcAddress(h,"ShellAboutA"));
printf("1.msgbox: %04lx\n\n",(ULONG)GetProcAddress(h,"ShellAboutA")); getch();
return 0;
}换成这个,看一下结果
输出:
h: 7fcb00001.msgbox: 7fce16661.msgbox: 7fce16661.msgbox: 7fce1666why????????按你楼上的方法不通,VC报错f:\myprojects\ll\ll.cpp(32) : fatal error C1010: unexpected end of file while looking for precompiled header directive,并且光标停在程序末尾
#include <stdio.h>
#include <conio.h>
#include <windows.h>
int main(int argc, char* argv[])
{
HINSTANCE h=LoadLibrary("user32.dll");
printf("h: %04lx\n\n",(ULONG)h);
PIMAGE_DOS_HEADER pDosHdr;
PIMAGE_NT_HEADERS pNTHeader;
DWORD ExportRva,FunctionRVA;
WORD index;
PIMAGE_EXPORT_DIRECTORY pExportStar;
PDWORD PAddressOfNames,PAddressOfFunctions;
PWORD PAddressOfNameOrdinals;
LPBYTE base; pDosHdr = (PIMAGE_DOS_HEADER)h;
base = (LPBYTE)pDosHdr;
pNTHeader = (PIMAGE_NT_HEADERS)(base+ (pDosHdr->e_lfanew));
ExportRva = pNTHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress;
pExportStar = (PIMAGE_EXPORT_DIRECTORY)(ExportRva + pNTHeader->OptionalHeader.ImageBase);
PAddressOfNames=(PDWORD)(pExportStar->AddressOfNames + pNTHeader->OptionalHeader.ImageBase);
PAddressOfNameOrdinals=(PWORD)(pExportStar->AddressOfNameOrdinals+ pNTHeader->OptionalHeader.ImageBase);
PAddressOfFunctions=(PDWORD)(pExportStar->AddressOfFunctions+ pNTHeader->OptionalHeader.ImageBase);
LPCSTR lpName;for(DWORD i=1;i<pExportStar->NumberOfNames;i++)
{
lpName = (LPCSTR)PAddressOfNames[i]+pNTHeader->OptionalHeader.ImageBase;
if(strcmp(lpName,"MessageBoxA")==0 ){
index=PAddressOfNameOrdinals[i];
FunctionRVA=PAddressOfFunctions[index-pExportStar->Base];
printf("1.msgbox: %s\n\n",lpName);
printf("1.msgbox: %04lx\n\n",(ULONG)FunctionRVA+pNTHeader->OptionalHeader.ImageBase);
break;
}
}
getch();
return 0;
}看看这个式子!
#include <conio.h>
#include <windows.h>
int main(int argc, char* argv[])
{
HINSTANCE h=LoadLibrary("user32.dll");
printf("h: %04lx\n\n",(ULONG)h);
PIMAGE_DOS_HEADER pDosHdr;
PIMAGE_NT_HEADERS pNTHeader;
DWORD ExportRva,FunctionRVA;
WORD index;
PIMAGE_EXPORT_DIRECTORY pExportStar;
PDWORD PAddressOfNames,PAddressOfFunctions;
PWORD PAddressOfNameOrdinals;
LPBYTE base; pDosHdr = (PIMAGE_DOS_HEADER)h;
base = (LPBYTE)pDosHdr;
pNTHeader = (PIMAGE_NT_HEADERS)(base+ (pDosHdr->e_lfanew));
ExportRva = pNTHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress;
pExportStar = (PIMAGE_EXPORT_DIRECTORY)(ExportRva + pNTHeader->OptionalHeader.ImageBase);
PAddressOfNames=(PDWORD)(pExportStar->AddressOfNames + pNTHeader->OptionalHeader.ImageBase);
PAddressOfNameOrdinals=(PWORD)(pExportStar->AddressOfNameOrdinals+ pNTHeader->OptionalHeader.ImageBase);
PAddressOfFunctions=(PDWORD)(pExportStar->AddressOfFunctions+ pNTHeader->OptionalHeader.ImageBase);
LPCSTR lpName;for(DWORD i=0;i<pExportStar->NumberOfNames;i++)
{
lpName = (LPCSTR)PAddressOfNames[i]+pNTHeader->OptionalHeader.ImageBase;
if(strcmp(lpName,"MessageBoxA")==0 ){
index=PAddressOfNameOrdinals[i];
FunctionRVA=PAddressOfFunctions[index];
printf("1.msgbox: %04d\n\n",(ULONG)index);
printf("1.msgbox: %s\n\n",lpName);
printf("1.msgbox: %04lx\n\n",(ULONG)FunctionRVA+pNTHeader->OptionalHeader.ImageBase);
break;
}
}
getch();
return 0;
}
上面有误,不准确,执行这个!!!不好意思
LPBYTE p = (LPBYTE)GetProceAddress(h, "MessageBoxA");
// 0x68是push立即数的指令,而真正的MessageBoxA的第一条指令是push ebp,应该是0x55
addrMessageBoxA = (DWORD)(*p == 0x68 ? *((LPDOWRD)(p+1)) : (DWORD)p);
printf("MessageBoxA: %08X\n", addrMessageBoxA);所以,你在Debug环境下取到上述的值就一点也不奇怪。换成Release就没有问题了。注:以上讨论只是针对98的情况。
我并不怀疑你说的,可为什麽我在DEBUG下运行照样正常呢?
--------------------------------------------
我是才学VC的,能够遇到这么多高手,真是荣幸荣幸!