none
VS2005开发MFC ActiveX控件项目的怪事情,添加方法的对话框中,“返回类型”那里不能选了,只能是HRESULT类型? RRS feed

  • 问题

  • 我用VS2005开发一个MFC的ActiveX控件,之前我一直在“类视图”按右键选择“添加方法”,然后再弹出的对话框中输入方法名称和返回值类型,以及参数等等。

    昨天我还用这个功能添加了一个方法,不知道为何今天想再添加另外一个方法的时候,“返回类型”那里却变成灰色不能选择,只能够是“HRESULT”类型?这究竟是为什么?我想它返回一个字符串。


    这是在odl文件里面以前生成的一些方法代码:
       [id(26), helpstring("方法GetSelectedFile")] BSTR GetSelectedFile(void);
    返回类型是“BSTR”,以前是可以选择很多返回类型的,不知道为何现在就不行了?


    看图:

     


    2010年2月2日 8:51

答案

  • 我觉得你返回值可以选,才是有问题的!!!

    在COM 世界里,接口发布的方法只有AddRef 和Release 两个方法不是返回HRESULT 的,其他的接口方法一定都是返回HRESULT 类型的,这是COM 的规范。 你返回一个BSTR 类型,反而会让一些语言(比如JavaScript)使用COM组件时导致问题。

    你的BSTR 可以通过参数的形式返回。 比如可以声明为: GetSelectedFile(BSTR* szFilename);


    • 已标记为答案 Nancy Shao 2010年2月16日 2:18
    2010年2月2日 9:00
    版主

全部回复

  • 我觉得你返回值可以选,才是有问题的!!!

    在COM 世界里,接口发布的方法只有AddRef 和Release 两个方法不是返回HRESULT 的,其他的接口方法一定都是返回HRESULT 类型的,这是COM 的规范。 你返回一个BSTR 类型,反而会让一些语言(比如JavaScript)使用COM组件时导致问题。

    你的BSTR 可以通过参数的形式返回。 比如可以声明为: GetSelectedFile(BSTR* szFilename);


    • 已标记为答案 Nancy Shao 2010年2月16日 2:18
    2010年2月2日 9:00
    版主
  • 以前一直可选啊!

    真是奇怪。。

    那么,按照你的说法,不能选的话,我要返回一个字符串要怎么写呢?
    例如我现在有一个BSTR GetSelectedFile(void);

    那么我在浏览器里面可以通过JavaScript调用控件的这个方法,直接获取返回值:
    var myControl = document.getElementById( "MyControl" );
    var s = myControl.GetSelectedFile();
    alert(s);


    那如果按照GetSelectedFile(BSTR* szFilename);这种写法的话,JS的代码要怎么写?
    da jia hao!
    2010年2月2日 9:25
  • 对了,我这个是ActiveX控件项目,不是COM组件。

    da jia hao!
    2010年2月2日 9:27
  • 以前一直可选啊!

    真是奇怪。。

    那么,按照你的说法,不能选的话,我要返回一个字符串要怎么写呢?
    例如我现在有一个BSTR GetSelectedFile(void);

    那么我在浏览器里面可以通过JavaScript调用控件的这个方法,直接获取返回值:
    var myControl = document.getElementById( "MyControl" );
    var s = myControl.GetSelectedFile();
    alert(s);


    那如果按照GetSelectedFile(BSTR* szFilename);这种写法的话,JS的代码要怎么写?
    da jia hao!
    javascript 就是按照你那样写。 你的脚本没写错,但是你的COM 接口方法写错了。 还是那句话,出了IUnknown 接口的AddRef 和 Release 方法,其它的接口方法一律返回HRESULT。 你这次这么写,javascript 和IDispatch 帮你转换正确了,不保证下次不规范的写法也能转换正确了。



    2010年2月2日 10:12
    版主
  • 简单举个例子,你可以看一下IWebBrowser2 接口,这个接口是微软给WebBrowser 控件设计的控制接口,其中有一个Name 属性,获取Name 值的接口方法是这样的:
    HRESULT IWebBrowser2::get_Name(BSTR *pbstrName );

    get_Name 方法跟你的GetSelectFile 是差不多的,都是返回BSTR 类型字符换。 你不会认为你比COM 技术的发明人定义的接口还规范吧?
    2010年2月2日 10:20
    版主
  • 同意楼上的
    2010年2月2日 15:17
  • 其实你们没有明白我的问题。我说过,之前在VC里面一直是可以选择其他类型的。

    后来我实在没有其他办法了,删除了项目文件夹下的NCB文件,然后VS2005就自动重建这个文件。之后就恢复正常,可以继续选择其他返回类型!


    da jia hao!
    2010年2月25日 9:26
  • 其实你们没有明白我的问题。我说过,之前在VC里面一直是可以选择其他类型的。

    后来我实在没有其他办法了,删除了项目文件夹下的NCB文件,然后VS2005就自动重建这个文件。之后就恢复正常,可以继续选择其他返回类型!


    da jia hao!

    傻逼。
    2010年8月13日 3:18
  • 简单举个例子,你可以看一下IWebBrowser2 接口,这个接口是微软给WebBrowser 控件设计的控制接口,其中有一个Name 属性,获取Name 值的接口方法是这样的:
    HRESULT IWebBrowser2::get_Name(BSTR *pbstrName );

    get_Name 方法跟你的GetSelectFile 是差不多的,都是返回BSTR 类型字符换。 你不会认为你比COM 技术的发明人定义的接口还规范吧?


    你有没有写过ActiveX控件的啊?不是COM组件。

    HRESULT IWebBrowser2::get_Name(BSTR *pbstrName );

    这个写法,请问在JS里面怎么调用?

    最后强调一点,我现在添加方法的时候是可以选择返回类型的,我不明白你说的不能选是指什么地方。


    da jia hao!
    2010年8月21日 2:37
  •  

    贴图证实返回类型可选(VS2008):



    严重质疑有些人是否光说不练,从来没有操作过VS?


    da jia hao!
    • 已编辑 liubin 2010年8月21日 2:47 edit
    2010年8月21日 2:46
  • 前面的哥们儿已经说了,微软也不提倡用HRESULT之外的类型当返回值。

    当你用javascript调用一个activex的函数的时候,一般情况是返回HRESULT类型的S_OK的,如果返回的不是S_OK,会抛异常(也就是说不用你在jscript里面自己判断是否是s_OK,而且你也获取不到),这个一般用来判断是否调用成功。

    返回值一般是在最后一个参数,看看你的IDL,参数写成[out][ret]的就是返回值,像你这种只返回一个字符串的,就把这个字符串(BSTR*)当做[out][ret]定义就行,然后直接在jscript里面var fuck = obj.asshole()就行了。

    2010年8月21日 15:17