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)

解决方案 »

  1.   

    //为什么会出现错误呢?GetLastError()值为7f。
      

  2.   

    我想应该是编译器优化把函数名变了
    好像动态链接的 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 需要导出的函数的名称
      

  3.   

    应该如此,我再程序员杂志2003合辑上看到的也不是这样的。可是你上面的这些东西改放在哪呢?dll的主程序文件中吗?
      

  4.   

    #include<windows.h>
    #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主程序,麻烦高人看看!
      

  5.   

    def 文件加在工程里就可以了.
    EXPORTS 下面写上你要导出的函数名就可以了,每个占一行
    这样的话函数在导出的时候就以 def 文件中的函数名为准.
    被修饰的函数名在写程序的时候好象是非法字符,无法直接使用,只有连接器才能识别.
    在控制台里 VC 自带了 dumpbin.exe 程序可以看到 dll,lib 的一些信息
    dumpbin /exports filename 就是看这个文件里导出标志符的信息
      

  6.   

    先看看你的DLL文件的导出函数对不对。dumpbin 当然可以用,不过推荐你一个小工具ViewDLL 
    http://www.zw-home.meibu.com/database/download/software/ViewDLL2.0.rar
    挺好用的
      

  7.   

    使用dumpbin /exports dllname.dll查看导出的名字。
    编译器可能更改你的导出名。
    用.DEF文件导出就可以解决这样的问题。
    参考:
    http://www.xiaozhou.net/cooldog/blogview.asp?logID=42
      

  8.   

    我刚找到Dumpbin在bin目录下,而且用def文件解决了问题,谢谢大家。又有了一点小进步,:)