【问题标题】:How can call instance by COM?如何通过 COM 调用实例?
【发布时间】:2009-12-18 17:41:32
【问题描述】:

我尝试在 F# 上通过 COM 调用 skype 实例。
一个目标是获取情绪信息。

test.fs

// Import skype4com Api
open SKYPE4COMLib

type SKYPE4COM =
    new() = new SKYPE4COM()

let GetMood =
    let aSkype = new SKYPE4COM
    mood <- aSkype.CurrentUserProfile.MoodText
    mood

但是在构建(之前也是)时,会发生错误。

表达式中此点或之前的不完整结构化构造

提前致谢。

这是我认为的下一个版本。

test01.fs

// Import skype4com Api
open SKYPE4COMLib

let GetMood =
    let aSkype = new SKYPE4COMLib()              // line 1
    mood <- aSkype.CurrentUserProfile.MoodText   // line 2
    mood                                         // line 3

错误消息(构建时)。
第 1 行:错误 FS0039:未定义类型“SKYPE4COMLib”
第 2 行:错误 FS0039:未定义值或构造函数“心情”
第 3 行中的行:错误 FS0039:未定义值或构造函数 'mood'

也是这样……

【问题讨论】:

  • 该消息是一般语法/格式问题。它表示哪条线? -- 问题出在之前的表达式中。
  • 感谢评论。此行中的消息'mood

标签: com f# windows-xp skype


【解决方案1】:

您的代码有几个问题。首先,SKYPE4COM 类的构造函数似乎是递归的(?!),如果您尝试创建实例,这将导致堆栈溢出。其次,您收到的错误是因为您正在使用 new 运算符,但您尚未完成对构造函数的调用(即您需要使用括号应用构造函数:let aSkype = new SKYPE4COM())。尽管如此,您还有另一个问题,因为您的类型没有公开CurrentUserProfile 属性,因此您的代码仍然无法工作。

试试这样的:

open SKYPE4COMLib

let getMood() =
  SkypeClass().CurrentUserProfile.MoodText

【讨论】:

  • 感谢建议。但我仍然想知道为什么需要公开 CurrentUserProfile 属性。因为我认为例如打开 System.Windows.Forms 然后让 frm = new Form();frm.Text
  • 非常感谢。让 getMood = SkypeClass().CurrentUserProfile.MoodText。然后完全按我的意愿工作。欣赏!
【解决方案2】:

考虑使用Type Extension 将成员添加到现有类型:

open SKYPE4COMLib

type SKYPE4COMLib with
    member this.GetMood() =
        aSkype.CurrentUserProfile.MoodText

这将允许您访问 GetMood,就好像它是在 SKYPE4COMLib 类型上定义的成员函数:

let x = new SKYPE4COMLib()
printfn "%A" (x.GetMood())

【讨论】:

    猜你喜欢
    • 2014-05-29
    • 1970-01-01
    • 1970-01-01
    • 2018-06-28
    • 1970-01-01
    • 2012-08-22
    • 2012-03-01
    • 2010-10-04
    • 2021-12-22
    相关资源
    最近更新 更多