转载请标明是引用于 http://blog.csdn.net/chenyujing1234
欢迎大家拍砖
一、定义
inline BOOL CRegistryOperate::DeleteRegeditItem(LPCTSTR szKey, LPCTSTR szSubkey, HKEY hRoot)
{
HKEY hKey;
if (ERROR_SUCCESS == ::RegOpenKeyEx(hRoot, szKey, 0, KEY_ALL_ACCESS, &hKey))
{
if (ERROR_SUCCESS == ::RegDeleteKey(hKey, szSubkey))
{
::RegCloseKey(hKey);
return true;
}
::RegCloseKey(hKey);
}
return false;
}
二、编译报错
1> 正在创建库 .\Debug/MyGina.lib 和对象 .\Debug/MyGina.exp
1>XRedGina.obj : error LNK2019: 无法解析的外部符号 "public: int __thiscall CRegistryOperate::DeleteRegeditItem(wchar_t const *,wchar_t const *,struct HKEY__ *)" (?DeleteRegeditItem@CRegistryOperate@@QAEHPB_W0PAUHKEY__@@@Z),该符号在函数 "public: int __thiscall CXRedGinaApp::RemoveAutoLogon(void)" (?RemoveAutoLogon@CXRedGinaApp@@QAEHXZ) 中被引用
1>.\Debug/XRedGina.dll : fatal error LNK1120: 1 个无法解析的外部命令
三、解决方法
inline 函数不会生成实体, 因此,如果在编译 单元 A.CPP 中 定义的 该函数,在 B.CPP 编译单 元内是不可见的. 但编译器找到了函数的说明, (在头文件内), 所以它会认为这是一个普通的函数. 会为调用此函数的地方生成 CALL 指令 来调用.
而在编译A.CPP单元的时候, 编译器可以发现此函数的内联说明. 宏观世界会在调用处进行内联扩展.而不会生成此函数的实体代码.
由于以上原因. 编译两个不同单元的时候对函数的编译方式不一致,导至此函数虽然有调用的地方,却没有实体代码.
解决的方法是, 内联函数应该在头文件内声明,并实现.
1、
把inline去掉,编译通过
BOOL CXRedGinaApp::RemoveAutoLogon()
{
BOOL bResult = TRUE;
bResult &= m_RegOperate.DeleteRegeditItem(DE_STR_REG_WINLOGON_KEY, DE_STR_REG_WINLOGON_ITEM_AUTOADMINLOGON);
bResult &= m_RegOperate.DeleteRegeditItem(DE_STR_REG_WINLOGON_KEY, DE_STR_REG_WINLOGON_ITEM_FORCEAUTOLOGON);
bResult &= m_RegOperate.DeleteRegeditItem(DE_STR_REG_WINLOGON_KEY, DE_STR_REG_WINLOGON_ITEM_DEFDOMNAME);
bResult &= m_RegOperate.DeleteRegeditItem(DE_STR_REG_WINLOGON_KEY, DE_STR_REG_WINLOGON_ITEM_DEFUSERNAME);
bResult &= m_RegOperate.DeleteRegeditItem(DE_STR_REG_WINLOGON_KEY, DE_STR_REG_WINLOGON_ITEM_DEFPASSWORD);
return bResult;
}