最近开始用vs2005学习Windows Shell扩展 编程,主要参考codeproject的几个经典例子 ,这几个经典例子 以前都是在vc6的环境下跑的,后来作者更新到vc7,网上还有好多教程是老版本的基于vc6环境的教程。vs2005属于vc8和vc7还是略有区别不过区别不大,现在把这两天学习的内容列下来,仅供参考。
1. 按照方法生成项目,系统会自动生成两个项目SimpleExt和SimpleExtPS,SimpleExtPS项目可以整个删掉,对结果没有什么影响。
2. 按照方法拷贝代码过来时,记得将教程中的GUID修改为自己的GUID,就是中括号中包含好多字符的那个。这个GUID可以在idl文件的“library SimpleExtLib”项下面找到。
3. 编译后出现错误提示:
error C2787: “IContextMenu”: 没有与该对象关联的 GUID
error C2440: “初始化”: 无法从“DWORD_PTR”转换为“const IID *”
1> 从整型转换为指针类型要求 reinterpret_cast、C 样式转换或函数样式转换
error C2440: “初始化”: 无法从“ATL::_ATL_CREATORARGFUNC (__stdcall *)”转换为“DWORD_PTR”
1> 没有使该转换得以执行的上下文
这个简单的用网上说的将包含文件PlatformSDK/include目录放在include目录前不适合vs2005,不能解决问题,倒是另一种方法可以解决,就是在SimpleShlExt.h文件中增加一行代码:
struct __declspec(uuid(“000214E4-0000-0000-C000-000000000046″)) IContextMenu;
若使用IQueryInfo的话要加入:
struct __declspec(uuid(“00021500-0000-0000-C000-000000000046″)) IQueryInfo;
4. 编译后出现错误提示:
1>正在注册输出…
1>Project : error PRJ0050: 未能注册输出。请确保您有修改注册表的相应权限。
1>生成日志保存在file://e:/project/shell/SimpleExt/SimpleExt/Debug/BuildLog.htm
这个问题需要在属性->配置属性->连接器->常规->注册输出项将“是”改为“否”即可。
5. 在项目的属性->自定义生成步骤->常规中设置命令行为:
regsvr32 /s /c “$(TargetPath)”
echo regsvr32 exec. time > “$(OutDir)/regsvr32.trg”
可自动注册dll,极为方便。
以上几个步骤基本可以保证实现预定功能。