VC6使用--(1)

来源:互联网 发布:电脑淘宝怎么开店 编辑:程序博客网 时间:2024/06/05 21:49
鉴于微软这些年,没做成一样技术,我说做成,就是做成熟,现在有必要给新入行的新人们讲讲那些可以用的微软产品。


本章讲讲Visual studio  6.0,主要讲C++.

偏重讲解,为什么,visual studio已经出了这么多版本,为什么我们要讲VC6。

第一个,学习使用VC6的BSC.
这个功能,只有VC6有。只有VC6才能精确定位,到底是什么地方进行了定义,
这个功能,也许有人觉得,用visual studio的高版本,或者是visual assistant的功能,也行,但事实不是这样,举例来说吧:
现在有这样一段代码:

#ifdef __cplusplus
extern "C"
#endif
XS_EXTERNAL(boot_PadWalker); /* prototype to pass -Wmissing-prototypes */
XS_EXTERNAL(boot_PadWalker)
{
。。。
}

我们想知道宏:XS_EXTERNAL的定义是什么。
这个例子,一个具体的实例,是编译一个用于PERL扩展的动态库的具体过程中,我遇到的情况。
因为用VC编译之后,动态库的函数没有导出。


我要找出这个错误。

然而定义是这样的:

#undef XS
#undef XS_EXTERNAL
#undef XS_INTERNAL
#if defined(__CYGWIN__) && defined(USE_DYNAMIC_LOADING)
#  define XS_EXTERNAL(name) __declspec(dllexport) XSPROTO(name)
#  define XS_INTERNAL(name) STATIC XSPROTO(name)
#endif
#if defined(__SYMBIAN32__)
#  define XS_EXTERNAL(name) EXPORT_C XSPROTO(name)
#  define XS_INTERNAL(name) EXPORT_C STATIC XSPROTO(name)
#endif
#ifndef XS_EXTERNAL
#  if defined(HASATTRIBUTE_UNUSED) && !defined(__cplusplus)
#    define XS_EXTERNAL(name) void name(pTHX_ CV* cv __attribute__unused__)
#    define XS_INTERNAL(name) STATIC void name(pTHX_ CV* cv __attribute__unused__)
#  else
#    ifdef __cplusplus    
#      define XS_EXTERNAL(name) extern "C" XSPROTO(name)
#      define XS_INTERNAL(name) static XSPROTO(name)
#    else
#      define XS_EXTERNAL(name)  XSPROTO(name)
#      define XS_INTERNAL(name) STATIC XSPROTO(name)
#    endif
#  endif
#endif

这个还是相对简单的,但也够瞧的,到底哪个分支才是呢?

是,虽然有经验的程序员,能猜到是哪个,但也不容易,我们猜到是这个分支:

#      define XS_EXTERNAL(name)  XSPROTO(name)

而实际上,应当走
这个分支。
#if defined(__CYGWIN__) && defined(USE_DYNAMIC_LOADING)
#  define XS_EXTERNAL(name) __declspec(dllexport) XSPROTO(name)

但如果你用的是VC6,那就不用头疼了。

右键“Go to defintion of XS_EXTERNAL",然后就到了真正那个宏的定义之处,如果没找到,而你确信有定义,那么就必然在工程设置里预定义的。

*********************************

好了,来看看,如何添加bsc文件。

选记住一个快捷键: Alt+f7


打开工程设置,走到这一个tab:

确保这些设置都正确,然后编译工程,只要能编译过,不需要链接成功,就可以准确定位了。
定位到错误的那行,然后更正成为这样:

 

define XS_EXTERNAL(name) __declspec(dllexport) XSPROTO(name)

 

好了,我们再看看,问题,是否得到了修复:

利用工具depends:

 

好了,出来了。

顺便说一下,这个PadWaker.dll ,是perl的调试用库。类似xDebug对php的作用。

*************************************

然而问题,并没有解决

正确的结果是这样的:

 

还有一个函数没有导出,经过仔细的研究,

define XS_EXTERNAL(name) __declspec(dllexport) XSPROTO(name)

这句话,不可能达到这样的效果。

那么是什么呢?

原来是在.def文件中定义的:

 

LIBRARY "PadWalker"
EXPORTS
  boot_PadWalker
  _boot_PadWalker = boot_PadWalker
 

把PadWalker.def 加入工程,效果出来了。

0 0