DLL显式装载问题,GetProcAddress无法获取函数地址,烦请大家给点指导!
大家好,我写了的个DLL:EncryptPHNA.dll,里面声明了一个导出函数:
BOOL WINAPI EncryptHNAString(LPCTSTR pszKey, LPCTSTR pszIn, LPTSTR pszOut, int nOutLen)
并在.def文件中声明:
LIBRARY "EncryptPHNA "
EXPORTS
EncryptHNAString
但是在显式装载时出现了问题:
typedef BOOL (WINAPI *ENCRYPT)(LPCTSTR pszKey, LPCTSTR pszIn, LPTSTR pszOut, int nOutLen);
HMODULE = m_hDLLModule = LoadLibrary(_T( "EncryptPHNA.dll "));
ENCRYPTm_Encrypt = (ENCRYPT)GetProcAddress(m_hDLLModule,(LPCSTR)_T( "EncryptHNAString "));
装载成功了,但是在获取函数地址时失败,用GetLastError()得到错误代码是127,查MSDN知道,是无法获取指定函数的地址.
我也上网查了些资料,并用Depends.exe查看了我的DLL,里面确实有EncryptHNAString这个导出函数.
然后在函数的声明之前加上 extern "C "__declspec(dllexport),仍然不行.
我想,既然装载DLL成功了,却获取不了函数地址,应该是我的函数声明之类有问题把.
还请大家给点指导!
[解决办法]
int _stdcall add(int x,int y)导出函数定义
引用时这样
typedef int (_stdcall * lpAddFun)(int,int);
int main(int argc, char* argv[])
{
HINSTANCE hDll;
lpAddFun addFun;
hDll = LoadLibrary( "..\\Debug\\dllTest.dll ");
if (hDll != NULL)
{
addFun = (lpAddFun)GetProcAddress(hDll, "add ");
//或addFun = (lpAddFun)GetProcAddress(hDll,MAKEINTRESOURCE(1));
//MAKEINTRESOURCE直接使用导出文件中的序号
if(addFun!=NULL)
{
int result = addFun(2,3);
printf( "\ncall add in dll:%d ",result);
}
FreeLibrary(hDll);
}
return 0;
}
我这样用的是可以成功的
[解决办法]
因为GetProcAddress(HMODULE, LPSTR), 后面这个参数只能是CHAR, 而不能是WIDE CHAR, 所以用UNICODE就不行了.
(LPCSTR)_T( "EncryptHNAString ")); 这样并不能将UNICODE转换成CHAR的