0

下面的代码是我的结构和包含结构引用的类。

typedef struct MESSAGE
{
    int MessageType;
     BSTR Name;
    _bstr_t TimeStampIs;
} MESSAGE, *PMESSAGE;

typedef struct MESSAGENODE
{
    PMESSAGE Message;
    MESSAGENODE* pNext;
} MESSAGENODE, *PMESSAGENODE;


class Message
{
private:
    PMESSAGENODE        MessageQueueFront;
    PMESSAGENODE        MessageQueueBack;
public:
    bool AddMessageToQueue(PMESSAGE Message);
    void DeleteMessageQueue(void){
    PMESSAGE pMess;
    while((pMess = GetMachineMessage()) != NULL)
    {
        if((pMess->DialysisDataIs))
        SysFreeString(pMess->Name.Detach());
        delete pMess;
}
}m;

int main()
{
PMESSAGE Message;
    Message = new MESSAGE;
    Message->Name=L"ABC";
    Message->TimeStampIs=L"25252";
    m.AddMessageToQueue(Message);
    m.DeleteMessageQueue();
    return 0;
}

当我编译上面的代码时,我在 DeleteMessageQueue 函数中收到以下错误

错误 C2451:'_bstr_t' 类型的条件表达式是非法的 错误 C2228:'.Detach' 的左侧必须有类/结构/联合

4

3 回答 3

3

有几件事,首先是你的错误

SysFreeString(pMess->Name.Detach());

Message::Name是一个原始 BSTR 指针,我向您保证它没有名为Detach(). 然而_bstr_t,课堂确实如此。将您的结构更改为:

typedef struct MESSAGE
{
    int MessageType;
    _bstr_t Name;
    _bstr_t TimeStampIs;
} MESSAGE, *PMESSAGE;

完成后,您可以完全删除SysFreeString()调用,因为现在 Name 和 TimeStampIs 都是智能指针,并且会在对象销毁时自动释放。

于 2012-11-02T07:44:44.900 回答
2

像这样

SysFreeString(pMess->Name);

但是没有充分的理由在这样的代码中使用 BSTR。编写自己的链表类也没有任何充分的理由。用简单的方法来做(正如 selbie 指出的,这不是你代码中唯一的错误),我建议std::wstring使用std::list.

#include <string>
#include <list>

struct MESSAGE
{
    int MessageType;
    std::wstring Name;
    std::wstring TimeStampIs;
};

class Message
{
private:
    std::list<MESSAGE> queue;
public:
    ...
};

最大的优势是你什么都不需要delete。所以所有这些问题都消失了。

于 2012-11-02T07:45:52.790 回答
0

更改此行:

SysFreeString(pMess->Name.Detach());

对此:

SysFreeString(pMess->Name);
pMess->Name = NULL;

但这不是你唯一的问题......

此外,这条线是完全错误的:

Message->Name=L"ABC";

您正在将 WCHAR* 分配给 BSTR。在您通过 SysFreeString 发布它之前,无论出于何种目的和目的,它都可以正常工作。(这可能会崩溃。)

按如下方式分配您的字符串:

pMess->Name = SysAllocString("ABC");

_bstr_t 是一个有用的字符串类,它内部包含一个 BSTR。在转换为/从本机 WCHAR* 字符串转换时,它会为您处理所有 SysAllocString/SysFreeString 调用。因此,将它用于 Name 就像将它用于 TimeStampIs 一样。

于 2012-11-02T07:45:19.487 回答