为什么我必须使用int将这些枚举标志值组合在一起?

发布于 2025-01-17 16:22:01 字数 2759 浏览 2 评论 0原文

也许有人可以解释为什么这实际上是一个问题背后的逻辑。

在我的c#dll中,我有一组通过com api暴露的标志值:

[Flags]
[Guid("~~~")]
[ComVisible(true)]
public enum AssignmentType
{
    None = 0,
    Attendant = 1,
    ConductorCBS = 2,
    ReaderCBS = 4,
    Chairman = 8,
    Mike = 16,
    PlatformAttendant = 32,
    Prayer = 64,
    OCLM = 128,
    Sound = 256,
    Student = 512,
    Custom = 1024,
    Demonstration = 2048,
    Assistant = 4096,
    Host = 8192,
    CoHost = 16384,
    OCLMTreasures = 32768,
    OCLMGems = 65536,
    OCLMLiving = 131072,
    StudentBibleReading = 262144,
    StudentDiscussion = 524288,
    StudentTalk = 1048576
}

在我的C ++ MFC项目中,以下内容如下:

enum __declspec(uuid("~~~"))
AssignmentType
{
    AssignmentType_None = 0,
    AssignmentType_Attendant = 1,
    AssignmentType_ConductorCBS = 2,
    AssignmentType_ReaderCBS = 4,
    AssignmentType_Chairman = 8,
    AssignmentType_Mike = 16,
    AssignmentType_PlatformAttendant = 32,
    AssignmentType_Prayer = 64,
    AssignmentType_OCLM = 128,
    AssignmentType_Sound = 256,
    AssignmentType_Student = 512,
    AssignmentType_Custom = 1024,
    AssignmentType_Demonstration = 2048,
    AssignmentType_Assistant = 4096,
    AssignmentType_Host = 8192,
    AssignmentType_CoHost = 16384,
    AssignmentType_OCLMTreasures = 32768,
    AssignmentType_OCLMGems = 65536,
    AssignmentType_OCLMLiving = 131072,
    AssignmentType_StudentBibleReading = 262144,
    AssignmentType_StudentDiscussion = 524288,
    AssignmentType_StudentTalk = 1048576
};

这是不获取的部分:

int iFlag = MSAToolsLibrary::AssignmentType::AssignmentType_None;
for (int iIndex = 0; iIndex < m_lbAssignmentsOCLM.GetCount(); iIndex++)
{
    if (m_lbAssignmentsOCLM.GetCheck(iIndex) == BST_CHECKED)
    {
        iFlag |= static_cast<MSAToolsLibrary::AssignmentType>(m_lbAssignmentsOCLM.GetItemData(iIndex));;
    }

}
theApp.WriteProfileInt(
    theApp.GetActiveScheduleSection(_T("Options")), _T("SRR_AssignmentsOCLM"), iFlag);

我必须使用int int < /代码> iflag变量。如果我尝试使该变量成为msatoolslibrary :: sistienmentType,则| =行将无法使用。

但是,我 am 能够对API进行类似的呼叫:

const COleDateTime datMeeting = GetMeetingDate(iRow);
auto eTypesToInclude = static_cast<MSAToolsLibrary::AssignmentType>(GetAssignmentsOCLMFlag());
CStringArray aryStrMeetingPersonnel;
theApp.MSAToolsInterface().GetPersonnelForMeeting(
    datMeeting,
    theApp.GetAssignHistoryPathEx(), 
    eTypesToInclude, aryStrMeetingPersonnel);

简而言之,为什么可以将组合的标志值作为msatoolslibrary :: sistientmentType传递给一个函数在API中,但是我必须使用int首先构建编译的标志值。

有意义吗?

Perhaps someone can just explain the logic behind why this is actually an issue.

In my C# DLL I have a set of flag values that expose via the COM API:

[Flags]
[Guid("~~~")]
[ComVisible(true)]
public enum AssignmentType
{
    None = 0,
    Attendant = 1,
    ConductorCBS = 2,
    ReaderCBS = 4,
    Chairman = 8,
    Mike = 16,
    PlatformAttendant = 32,
    Prayer = 64,
    OCLM = 128,
    Sound = 256,
    Student = 512,
    Custom = 1024,
    Demonstration = 2048,
    Assistant = 4096,
    Host = 8192,
    CoHost = 16384,
    OCLMTreasures = 32768,
    OCLMGems = 65536,
    OCLMLiving = 131072,
    StudentBibleReading = 262144,
    StudentDiscussion = 524288,
    StudentTalk = 1048576
}

In my C++ MFC project, the above is exposed as follows:

enum __declspec(uuid("~~~"))
AssignmentType
{
    AssignmentType_None = 0,
    AssignmentType_Attendant = 1,
    AssignmentType_ConductorCBS = 2,
    AssignmentType_ReaderCBS = 4,
    AssignmentType_Chairman = 8,
    AssignmentType_Mike = 16,
    AssignmentType_PlatformAttendant = 32,
    AssignmentType_Prayer = 64,
    AssignmentType_OCLM = 128,
    AssignmentType_Sound = 256,
    AssignmentType_Student = 512,
    AssignmentType_Custom = 1024,
    AssignmentType_Demonstration = 2048,
    AssignmentType_Assistant = 4096,
    AssignmentType_Host = 8192,
    AssignmentType_CoHost = 16384,
    AssignmentType_OCLMTreasures = 32768,
    AssignmentType_OCLMGems = 65536,
    AssignmentType_OCLMLiving = 131072,
    AssignmentType_StudentBibleReading = 262144,
    AssignmentType_StudentDiscussion = 524288,
    AssignmentType_StudentTalk = 1048576
};

This is the part of don't get:

int iFlag = MSAToolsLibrary::AssignmentType::AssignmentType_None;
for (int iIndex = 0; iIndex < m_lbAssignmentsOCLM.GetCount(); iIndex++)
{
    if (m_lbAssignmentsOCLM.GetCheck(iIndex) == BST_CHECKED)
    {
        iFlag |= static_cast<MSAToolsLibrary::AssignmentType>(m_lbAssignmentsOCLM.GetItemData(iIndex));;
    }

}
theApp.WriteProfileInt(
    theApp.GetActiveScheduleSection(_T("Options")), _T("SRR_AssignmentsOCLM"), iFlag);

I had to use int for the iFlag variable. If I try to make that variable a MSAToolsLibrary::AssignmentType then the |= line will not work.

Yet, I am able to make calls like this to the API:

const COleDateTime datMeeting = GetMeetingDate(iRow);
auto eTypesToInclude = static_cast<MSAToolsLibrary::AssignmentType>(GetAssignmentsOCLMFlag());
CStringArray aryStrMeetingPersonnel;
theApp.MSAToolsInterface().GetPersonnelForMeeting(
    datMeeting,
    theApp.GetAssignHistoryPathEx(), 
    eTypesToInclude, aryStrMeetingPersonnel);

In short, why is it OK to pass the combined flag values as a MSAToolsLibrary::AssignmentType to a function in the API, but I had to use an int to build the compiled flags value first.

Make sense?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文