当使用导出函数的序号来调用dll中的函数时,需要使用MAKEINTRESOURCE宏来将序号转换成一个字符串地址,也就是使用如下形式:
GetProcAddress(dllhandle, MAKEINTRESOURCE(10));
我查看了一下MAKEINTRESOURCE的定义,它是((ULONG_PTR)(USHORT)),其实也就是((unsigned int)(unsigned short)),不知道为什么先要转换成16位的地址,然后再转换为32位地址,难道只能寻址64k吗?还有,GetProcAddress的第二个参数是一个LPCSTR类型,LPCSTR是一个const char *,为什么可以被赋值成一个((unsigned int)(unsigned short)),而不需要任何强制类型转换?谢谢!

解决方案 »

  1.   

    在winuser.h中它的定义可能有两个:
    #define MAKEINTRESOURCEA(i) (LPSTR)((ULONG_PTR)((WORD)(i)))
    #define MAKEINTRESOURCEW(i) (LPWSTR)((ULONG_PTR)((WORD)(i)))
    咱们用的应该是这两个之一,而不是ks.h中的那个。
    因为GetProcAddress的第二个参数为const char*,而我们提供的是一个序号,所以用它来强制类型转换,没别的用途
    先转成WORD的意思是因为一个dll输出函数个数的限制。