引子:“在C++builder6中动态调用的方法,(静态的调用试验没成功,主要是用implib没法生成正确的Pinyin.lib,内容缺文件名,一启动就报找不到文件,不知道谁可以帮忙解决这个问题)”。
在做《在delphi 7中实现获取汉字拼音首字母》时,顺便试着写C++builder 6的调用例子,可惜当时静态调用没成功,带中文路径的implib生成的lib文件竟然和在根目录下生产成的lib文件内容不一样(用UltraEdit看就知道了),如:"implib E:/拼音首字母/Pinyin.lib E:/拼音首字母/Pinyin.dll" 和 "implib F:/Pinyin.lib F:/Pinyin.dll" 生成的Pinyin.lib就不一样。前者编译通过,运行时,报找不到"E CORPORATION .dll",然后访问地址出错;后者直接编译不过,报连接错误"[Linker Error] Unresolved external 'GetPinYinLeader' referenced from E:/拼音首字母/UNIT1.OBJ "。
试过其他各种方法生成lib,包括直接修改二进制文件,都没成功。最后想到以前有个帖子说可以伪造一个有空方法体的dll,生成的lib可直接调用vc生成的dll。
原话是这样的:“lib可以造假的,比如vc dll有一个函数 你用bcb写一个dll也有同样的函数,实现是空的,然后编译出来
其他使用dll的工程链接lib中这个lib,dll则还是用VC的dll”
参考地址:http://topic.youkuaiyun.com/u/20090302/17/99d1fbc5-4be6-4744-96d9-09b16c0d93c3.html
这个拼音库的帮助参考文字是这样的:
----------------------------------------------------------------------------
本DLL只有两个函数,函数原型如下:
//获得拼音
//参数依次为: 拼音缓存区,要转换的字符,分隔符
BOOL WINAPI GetPinYin(PCHAR pBuf,PCHAR pStr,PCHAR pSeparator)
//获得拼音首字母
//参数依次为: 拼音缓存区,要转换的字符
BOOL WINAPI GetPinYinLeader(PCHAR pBuf,PCHAR pStr)
-------------------------------------------------------------------------------------
下面是伪造dll的代码:
静态调用代码:
经过测试,结论:是可以这样做的,得出的结果跟动态调用一样。