转载请标明是引用于 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; }