int main()
{HINSTANCE hDll;
HWND TagWindow;
DWORD TagThreadId;
MYHOOKFUNC HookFunc;
MYFUNCT Myfunc;
TCHAR DllPath[200]="H:\\Documents and Settings\\xu\\桌面\\吴\\mylib\\debug\\mylib.dll";
hDll=LoadLibrary(DllPath);
//装入成功!
if(hDll)
{HookFunc=(MYHOOKFUNC)GetProcAddress(hDll,TEXT("SetHook"));
printf("%x,%x\n",HookFunc,GetLastError());
//为什么会出现错误呢?GetLastError()值为7f。
if(HookFunc)
{TagWindow=FindWindow(NULL,TEXT("俄罗斯方块!"));
printf("%x",TagWindow);
TagThreadId=GetWindowThreadProcessId(TagWindow,NULL);
if(TagThreadId)
HookFunc(TagThreadId);
}
// Myfunc=(MYFUNCT)GetProcAddress(hDll,TEXT("put"));
// Myfunc();
}
return 0;
}SetHook原型是_declspec (dllexport)BOOL WINAPI SetHook(DWORD dwThreadId)
{HINSTANCE hDll;
HWND TagWindow;
DWORD TagThreadId;
MYHOOKFUNC HookFunc;
MYFUNCT Myfunc;
TCHAR DllPath[200]="H:\\Documents and Settings\\xu\\桌面\\吴\\mylib\\debug\\mylib.dll";
hDll=LoadLibrary(DllPath);
//装入成功!
if(hDll)
{HookFunc=(MYHOOKFUNC)GetProcAddress(hDll,TEXT("SetHook"));
printf("%x,%x\n",HookFunc,GetLastError());
//为什么会出现错误呢?GetLastError()值为7f。
if(HookFunc)
{TagWindow=FindWindow(NULL,TEXT("俄罗斯方块!"));
printf("%x",TagWindow);
TagThreadId=GetWindowThreadProcessId(TagWindow,NULL);
if(TagThreadId)
HookFunc(TagThreadId);
}
// Myfunc=(MYFUNCT)GetProcAddress(hDll,TEXT("put"));
// Myfunc();
}
return 0;
}SetHook原型是_declspec (dllexport)BOOL WINAPI SetHook(DWORD dwThreadId)
解决方案 »
- 已经工作的,你们所在的公司是从事哪方面程序开发
- 求助:在什么地方绘制能绘制在子控件之上?
- combo_box无法添加CString 型变量
- 高分求救,如何读写高端物理内存?例如F00000000
- 请教两个工具栏中button大小不同的问题????高分!!!
- 能让回显变成星号吗?
- 那有 MSDN 下载 或谁能提供下载
- 怎么在自己的浏览器中加入Internet选项?
- 学过了VC,我应该学 c++ Builder 还是Delphi,还是JAVA????
- 呜呜,我的SetWindowsHookEx为什么就是不调用回调函数呀,高手帮帮忙呀!
- 寻找Windows内部的宏定义
- 如何知道SendMessage执行的过程是否正确完成?
好像动态链接的 DLL 在编译的时候需要一个 def 文件
; KEY.def : Declares the module parameters for the DLL.LIBRARY "KEY"
DESCRIPTION 'KEY Windows Dynamic Link Library'EXPORTS
; Explicit exports can go here 需要导出的函数的名称
#include<stdio.h>
#include"resource.h"
#define LIBFUNC _declspec(dllexport)LRESULT WINAPI GetMsgProc(int ncode,WPARAM wparam,LPARAM lparam);
BOOL WINAPI DialogProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam);#pragma data_seg("shared")
HHOOK g_hhook=NULL;
DWORD g_dwThreadId=0;
int a[18*12]={0};
#pragma data_seg()#pragma comment(linker,"/section:Shared,rws")HINSTANCE g_hinstDll=NULL;BOOL WINAPI DllMain(HINSTANCE hinstDll,DWORD fdwReason,LPVOID fImpLoad)
{switch(fdwReason)
{case DLL_PROCESS_ATTACH:
g_hinstDll=hinstDll;
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}_declspec (dllexport)BOOL WINAPI SetHook(DWORD dwThreadId)
{BOOL fOk=FALSE;
if(dwThreadId!=0)
{g_hhook=SetWindowsHookEx(WH_GETMESSAGE,GetMsgProc,g_hinstDll,dwThreadId);
if(fOk=(g_hhook!=NULL))
{g_dwThreadId=GetCurrentThreadId();
fOk=PostThreadMessage(dwThreadId,WM_NULL,0,0);
}
}
else {fOk=UnhookWindowsHookEx(g_hhook);
g_hhook=NULL;
}
return fOk;
}LRESULT WINAPI GetMsgProc(int nCode,WPARAM wParam,LPARAM lParam)
{static BOOL fFirstTime=TRUE;
if(fFirstTime)
{fFirstTime=FALSE;
CreateDialog(g_hinstDll,MAKEINTRESOURCE(ID_DIALOG),NULL,DialogProc);
PostThreadMessage(g_dwThreadId,WM_NULL,0,0);
}
return CallNextHookEx(g_hhook,nCode,wParam,lParam);
}BOOL WINAPI DialogProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{int i,*p;
p=(int *)0x0041a0ac;
switch(uMsg)
{case WM_APP:
for(i=0;i<18*12;i++)
a[i]=p[i];
}
return 0;
}_declspec (dllexport) void put()
{int i;
for(i=0;i<12*18;i++)
printf("%d",a[i]);
}这是我的dll主程序,麻烦高人看看!
EXPORTS 下面写上你要导出的函数名就可以了,每个占一行
这样的话函数在导出的时候就以 def 文件中的函数名为准.
被修饰的函数名在写程序的时候好象是非法字符,无法直接使用,只有连接器才能识别.
在控制台里 VC 自带了 dumpbin.exe 程序可以看到 dll,lib 的一些信息
dumpbin /exports filename 就是看这个文件里导出标志符的信息
http://www.zw-home.meibu.com/database/download/software/ViewDLL2.0.rar
挺好用的
编译器可能更改你的导出名。
用.DEF文件导出就可以解决这样的问题。
参考:
http://www.xiaozhou.net/cooldog/blogview.asp?logID=42