为什么我必须使用int将这些枚举标志值组合在一起?
也许有人可以解释为什么这实际上是一个问题背后的逻辑。
在我的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 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论