小编Xpe*_*tal的帖子

如何将暴露给COM-interop的.NET对象标记为单线程?

在C++中定义COM可见类时,我可以在头文件(threading(single)行)中定义支持的线程模型:

[
    coclass,
    default(IComInterface),
    threading(single),
    vi_progid("Example.ComClass"),
    progid("Example.ComClass.1"),
    version(1.0),
    uuid("72861DF5-4C77-43ec-A4DC-ED04396F0CCD")
]
Run Code Online (Sandbox Code Playgroud)

是否有类似的方法在.NET中设置线程模型(例如属性)?我目前正在定义我的COM类:

[Guid("67155A91-2948-43f5-B07F-5C55CDD240E5")]
[ComVisible(true)]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
public interface IComInterface
{
    ...
}


[Guid("DC5E6955-BB29-44c8-9FC0-6AADEEB2AFFB")]
[ClassInterface(ClassInterfaceType.None)]
[ProgId("Example.ComClass")]
public class ComClass : IComInterface
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

- 编辑:

对标记答案的评论非常重要.似乎告诉RegAsm设置不同的ThreadingModel的唯一方法是编写一个标有该[ComRegisterFunction]属性的自定义注册方法.

.net c# com multithreading com-interop

7
推荐指数
1
解决办法
3789
查看次数

如何在动态创建MFC控件时重新创建资源编辑器使用的样式?

我需要动态地在MFC对话框中创建一些控件.到目前为止,创建工作正常,但动态创建的控件与使用资源编辑器创建的控件看起来不同.有些控件甚至表现不同.我想,我错过了生成的代码所做的一些初始化.

目前我只创建CStaticCEdit控制.当我动态创建它们时,两者都不使用标准的Windows字体(如果我没记错的话,字体看起来更像是Windows 95之前使用的默认字体).

此外,CEdit控件的行为与我使用资源编辑器创建它时的行为不同.动态创建的控件似乎将文本长度限制为可见大小.我可以设置较长的文本SetWindowText()并重新读取全文GetWindowText(),但用户无法输入长于显示大小的文本.CEdit由资源编辑器创建的控件表现不同:如果用户输入的文本长于可显示的文本,则输入的文本将在控件内"滚动"(没有滚动条,因为它只有一个行控件).

我尝试通过调用SetLimitText()控件来解决这个问题,但这并未改变行为.

控件保存到对话框类中定义的数组:

CStatic** m_pLabels;
CEdit**   m_pEdits;
Run Code Online (Sandbox Code Playgroud)

控件的创建发生在OnInitDialog()对话框类的方法中:

for (int i = 0; i < max; i++)
{
  m_pLabels[i] = new CStatic();
  m_pLabels[i]->Create("key", WS_CHILD | WS_VISIBLE | SS_RIGHT,
    CRect(10, 10 + i * 30, 130, 35 + i * 30), this);

  m_pEdits[i] = new CEdit();
  m_pEdits[i]->CreateEx(WS_EX_CLIENTEDGE, "EDIT", "",
    WS_CHILD | WS_TABSTOP | WS_VISIBLE | WS_BORDER,
    CRect(133, 10 + i * 30, …
Run Code Online (Sandbox Code Playgroud)

c++ mfc

5
推荐指数
2
解决办法
2595
查看次数

标签 统计

.net ×1

c# ×1

c++ ×1

com ×1

com-interop ×1

mfc ×1

multithreading ×1