我在ATL中这样定义我的函数的
[id(1), helpstring("method showset")] HRESULT showset([in] BSTR strinput,[out,retval] BSTR* strset);STDMETHODIMP Cshowset::showset(BSTR strinput, BSTR *strset)
{
// TODO: Add your implementation code here
char m_sys[20];
strcpy(m_sys,(char *)strinput);
// strcpy(m_sys,"TRM");怎么将strinput 的值传到m_sys中呢,就象这样strcpy(m_sys,"TRM");假如我输入TRM,怎么将TRM传到m_sys中呢,简单吧,请教大家了

解决方案 »

  1.   

    CW2CT szInput(strinput);
    strcpy(m_sys, szInput);
      

  2.   

    _variant_t 和 _bstr_t 到底是什么玩意? 
        很不幸,我们喜爱的CString类在COM里用不了(CStringEx也一样),因为COM必须设 
    计成跨平台,它需要一种更普遍的方式来处理字符串以及其他数据。这就是VARIANT数据 
    类型的来历,还有BSTR类型。VARIANT就是一个巨大的 union,包含了你能想得到的所有 
    的数据类型,除了char*,不过还好,BSTR取代了char*。 
        (译者注:似乎VARIANT是个很慢的东西,大家都不愿意使它,不过按我看来,情况 
    没这么糟糕,union照理说不应该慢到哪去,要说慢,也是慢在给VARIANT分配地址空间 
    上,这点在VC里面做得比VB要好 
        这些东西看起来的确有点恐怖,不过实在用不着怕,等下面熟悉了这两个东西之后 
    ,你会很快喜欢的) 
        简单来说,_variant_t是一个类,包装了VARIANT数据类型,并允许我们简单的对之 
    进行强制类型转换(相信大家都喜欢这个),_bstr_t对BSTR干了同样的事情。在下面的例 
    子里,你将看到怎么用GetCollect把数据取到VARIANT里,又怎么把它放到_bstr_t里, 
    最后强制转换成char*,以及把_variant_t强制转换成long、double或者其他一切东西: 
     
        _variant_t Holder; 
        // first get the VARIANT and put it into the _variant_t 
        Holder = MySet->GetCollect("FIELD_1"); 
        // now put it into a _bstr_t and cast it to a char* 
        m_List.AddString((char*)_bstr_t(Holder)); 
     
        对比一下没有用 _variant_t 和 _bstr_t 的代码: 
     
        COleVariant covFieldValuel 
        VARIANT vFieldValue 
        CString Holder; 
        MySet->GetFieldValue("FIELD_1", covFieldValue); 
        vFieldValue = (LPVARIANT)covFieldValue; 
        Holder.Format("%s",vFieldValue->pbVal); 
        m_List.AddString(Holder); 
     
        区别大了! 
     
      

  3.   

    具体可以这么做:
    // TODO: Add your implementation code here
    char m_sys[20];_bstr_t str(strinput);
    strcpy(m_sys,str);// strcpy(m_sys,"TRM");