IAgoraService智能指针问题

https://docs.agora.io/cn/Real-time-Messaging/messaging_cpp_windows?platform=Windows%20CPP
文档中描述
std::unique_ptragora::base::IAgoraService agoraInstance_;
但是在vs2019中,表现出错误
agora::base::IAgoraService::~IAgoraService”: 无法访问 protected 成员
目前使用手动创建和release的方法,没有使用智能指针。但是其他使用智能指针的接口并没这类问题
std::unique_ptragora::rtm::IRtmServiceEventHandler RtmEventCallback_;
std::shared_ptragora::rtm::IRtmService rtmInstance_;
目前没有出现此类问题

能否贴下你的代码?

我看了一下文档和 demo,有可能是文档没有更新,我再确认下。你先参照 demo 吧:
https://download.agora.io/rtmsdk/release/Agora_RTM_SDK_for_Windows_x86_v1.2.1.zip?_ga=2.36707104.1878295760.1575253096-1276532045.1570589025

%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20191203104532

#pragma once

#include <memory>
#include <unordered_map>

#include "IAgoraRtmService.h"
#include "IAgoraService.h"
#include "RTmWrap.h"

using namespace agora::rtm;

class CAgoraRTMInstance
{
public:
  static CAgoraRTMInstance* getSignalInstance(const std::string &appId = "", CRTMCallBack* callBack = nullptr);
  void ReleaseInstance();
  ~CAgoraRTMInstance();

  void setLoginWnd(HWND wnd);
  HWND getLoginWnd();
  void setChatMsgWnd(HWND wnd);
  HWND getChatMsgWnd();

  bool getptStatus();
  void setptStatus(bool status);
  bool getChannelStatus();
  void setChannleStatus(bool status);

  void setAppId(const std::string &appId);
  std::string getAppId();
  void setAppCertificateId(const std::string &certificateId);
  std::string getCertificateId();
  std::string getLoginAccount();

  IRtmService* getAgoraAPI();

  bool Login(const std::string &account, const std::string & token);
  bool LogOut();

  bool QueryIsOnline(const std::string &account);
  bool sendInstantMsg(const std::string &account, const std::string &instanmsg,bool bEnableOfflineMessage);
  bool sendChannelMsg(const std::string &channel, const std::string &ChannelMsg,bool bEnableOfflineMessage);
  bool ChannelQueryNumResult(const std::string &channelID);

  bool JoinChannel(const std::string &channelID);
  bool LeaveChannel();

  std::string getSDKVersion();

protected:
  CAgoraRTMInstance(const std::string appId, CRTMCallBack* callBack);
  void InitRTMService();

private:

  static CAgoraRTMInstance* m_pAgoraRTMInstance;

  bool m_isLoginPt;
  bool m_isJoinChannel;

  std::string m_Account;
  std::string m_ChannelName;

  std::string m_AppId;
  std::string m_AppCertificateId;

  std::unique_ptr<agora::base::IAgoraService> m_agoraService;
  agora::base::AgoraServiceContext context_;
  CRTMCallBack *m_RtmCallback;
  IRtmService* m_rtmService;
  IChannel* m_Channel;

  HWND m_loginWnd;
  HWND m_ChatMsg;
};

sdk例子:
%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20191203121115
%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20191203121140
我理解,要点是在构造函数中给智能指针赋值。
按照sdk例子做了如下处理
%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20191203104555 %E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20191203121010


仍然报错。真不好意思麻烦你

那个什么,大佬,你给的demo的sdk,版本是1.2.1我在官网下载的版本,是2.3

根据这个错误提示,是因为在智能指针释放的时候,调用了析构函数,析构函数又调用了类中的保护成员,导致报错。

你在哪下载的 2.3 版本哇?RTM SDK 最新也才到 1.2.1 呀


这是发生了什么。。。

https://download.agora.io/rtmsdk/release/Agora_RTM_SDK_for_Windows_x64_v1.2.1.zip?_ga=2.116249670.1334310932.1575253313-366472408.1574043770

Windows v1.2.1(x64)
写的是这个,下载下来看dll是那个

是因为我是64位吗?
我看了,32位那个,版本是一致的

实际上重点是,目前我运行这个sdk,login的时候传完token,会崩溃


你看,别的还好说,可是这个会崩溃,我可就尴尬了,没法往下调

这个应该不影响什么的。用 32 位的吧,比较推荐用 32 的。

你试试看直接跑 sdk 文件夹里的 Agora-RTM-Tutorial-Windows 项目,会崩溃吗?

上面的指针问题,查下是不是智能指针使用的问题: 若定义为 unique_ptr指针,指针必须指向new分配的内存,不可以拷贝和赋值。

这个晕菜了,我这里没有mfc

实际上我觉得,目前咱们的版本根本没有在64位编译过。
咱们在64位平台的编译选项根本就是空的

我准备改用32位。
那么,我目前同时用到rtc和rts的sdk,这里面有同名文件,内容不一致。应该严格分开,还是使用其中哪个版本就可以?

是头文件同名了吗?有两种方法:
1、把两个文件里声明的方法,全都写到一个文件里;
2、更改其中一个头文件的名字,但是对应的 include 到这个头文件的地方,都需要改名。

rtc和rtm里面都有IAgoraService。这个东西好像会冲突

我用void* ,彻底隔离了这些玩意。只在cpp里面引用……
你们研发出来的同一个平台的产品,怎么没有一起搭配使用一下看看啊
难道是不同团队完全隔离吗?

我会把这个问题反馈给相关同事!