先申明,这里只讨论VB5下的情况(不知道是不是它的BUG啊:)
VB5里的InStr若遇到某些日文字符时会出现内存溢出的错误。
所以,想用自己的InStr去替换系统的。不知道怎么做?已试过,虽然在公共模块ModMain.Bas里定义了一个Public Function InStr 
但实际使用时,其它的字符串都可以自动调用自己编的那个函数,唯独遇到日文字符时,在调用前还是出错,就是说根本没进入我的函数就报错了,除非用ModMain.InStr强行指定的办法才能进入俺自己的安全函数。
但那样的话就等于白做了,我想让它以默认的方式来使用啊!!!
(大致搜了一下,程序中用了1200多个InStr,实在是不知道哪里会使用到日文字符啊,都用强行指定的话,那)

解决方案 »

  1.   

    一、换个名字呗
    二、将你的InStr放在一ActiveX Dll中,然后引用该dll。并在“引用”对话框中调整该dll的顺序,使其处于最上面
      

  2.   

    //(大致搜了一下,程序中用了1200多个InStr,实在是不知道哪里会使用到日Ctrl+H打开替换对话框
    将所有“InStr”替换成“ModMain.InStr”
      

  3.   

    能不能不加上ModMain引用啊?InStr是很常用的内部函数,有很多代码都用到它,
    但不是所有用到InStr的代码所在的工程里都有ModMain的!而有时代码既要在有ModMain的工程里用,又要在没有ModMain的工程里用,
    即使用#IF 的话也很麻烦的,要一个个去找,改来改去,会大大增加出错的几率! :(实际上,俺想找一个更底层的通用的不影响源码级的更改函数优先级办法
      

  4.   

    现在出问题的部分并不是由源码造成的,而是VB运行库级别的原因。
    我一般的原则是,谁出错找谁,在源码能运行的情况下,就应该尽量避免修改源码(指不改动功能的前提下),每一次修改都可能引出新的BUG,简直是恶梦。
    理想的情况,就是跳过调用端,直接在提供端,功能函数内部解决它,对外保持一致的接口,这才是根本的办法。
      

  5.   

    那就是方法二
    调整ActiveX Dll的顺序
    VB查找某个函数所属的模块是按照这样的顺序,先查找引用(按引用顺序),最后才是自身工程内
    而InStr是属于msvbvm60.dll提供的的“Visual Basic For Applications”,排在引用中的第一位
    你只有自己写个ActiveX dll,然后将该ActiveX dll排在“Visual Basic For Applications”的前面
      

  6.   

    其实还存在方法三:
    利用API Hook技术,更改msvbvm50.dll中的__vbaInStr函数,使别人在调用__vbaInStr时跳转到你的函数
    但是技术难度极高,单这个功能的代码量就很可能超过你工程中其他代码的总和
    其实有必要这么麻烦吗?
    用VB6+sp6
    一切搞定