小编Ili*_*lia的帖子

有谁知道免注册COM和拖放功能之间可能存在哪种关系?

有谁知道免注册COM和拖放功能之间可能存在哪种关系?

具体来说,我们有一个巨大的C++ CAD/CAM应用程序,包括许多EXE和数百个DLL.其中许多用作COM服务器(进程内和进程外)和/或客户端,还实现ActiveX控件.

大多数ActiveX控件和CMDIFrameWnd其中一个EXE 的主要窗口都实现了拖放功能.ActiveX控件实现了drop source和drop target,主窗口只是drop target,特别是来自Windows Explorer的文件.

拖/放实施是非常标准的并且基于来自衍生出的两个数据成员COleDataSourceCOleDropTarget用于分别放置源和放置目标.所述COleDropTarget衍生的部件与在窗口的相应窗口注册OnCreate方法.它还覆盖OnDragEnter,OnDragOverOnDrop以类似的方式方法.即,系统提供的COleDataObject参数被要求特定格式(特别是CF_HDROP),并且在肯定答案的情况下,从剪贴板提取数据(例如,文件路径).代码如下所示:

static FORMATETC g_FileFmt = {CF_HDROP, 0, DVASPECT_CONTENT, 0, TYMED_HGLOBAL};
    ....
// Inside OnDragEnter, OnDragOver or OnDrop method
STGMEDIUM stgmedium = {0,0,0};
if (pDataObject->IsDataAvailable(g_FileFmt.cfFormat))
{
    HRESULT hr = pDataObject->GetData(g_FileFmt.cfFormat, &stgmedium);
    HDROP hdrop = (HDROP)GlobalLock(stgmedium.hGlobal);
    if (hdrop != 0)
    {
        int FilesCount = DragQueryFile(hdrop, (UINT)-1, 0, 0);
        if (FilesCount != 0)
        {
            TCHAR FileName[_MAX_PATH]; …
Run Code Online (Sandbox Code Playgroud)

c++ com manifest side-by-side regfreecom

6
推荐指数
1
解决办法
404
查看次数

查找RegisterWindowMessage Windows API获取的消息的原始名称

在调试应用程序以尝试提高性能时,我发现它在处理大于0xC000的消息时会浪费时间.这显然是RegisterWindowMessageAPI 创建的消息.但是,该应用程序使用了超过两百个这样的消息; 有没有办法通过数值找到邮件的原始名称?

GetAtomNameGlobalGetAtomName失败,

ERROR_INVALID_HANDLE

错误.

c++ winapi

4
推荐指数
1
解决办法
181
查看次数

如何获得使用BTNS_AUTOSIZE样式创建的工具栏按钮的实际大小?

我创建了一个包含以下样式的工具栏:

DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS
                | CCS_NODIVIDER | CCS_NOPARENTALIGN | CCS_NORESIZE
                | TBSTYLE_FLAT | TBSTYLE_LIST;
Run Code Online (Sandbox Code Playgroud)

然后我用纯文本按钮填充工具栏:

bool InsertButton(int Index, int CmdId, BYTE Style, BYTE State,
                  int TxtIdx, DWORD_PTR lParam)
{
    TBBUTTON tbb = { 0 };
    tbb.idCommand = CmdId;
    tbb.fsStyle = Style;    // == BTNS_AUTOSIZE | BTNS_DROPDOWN
    tbb.fsState = State;
    tbb.iBitmap = I_IMAGENONE;
    tbb.iString = TxtIdx;
    tbb.dwData = lParam;

    return (bool)CToolBarCtrl::InsertButton(Index, &tbb);
}
Run Code Online (Sandbox Code Playgroud)

填充工具栏后,我想获得其按钮的实际大小.但GetButtonInfo返回零大小.

int GetBtnSize(int Idx) const
{
    TBBUTTONINFO tbbi = { sizeof(tbbi), …
Run Code Online (Sandbox Code Playgroud)

windows winapi mfc visual-c++ common-controls

3
推荐指数
1
解决办法
108
查看次数

有没有一种方法可以从其专业化中调用泛型类模板的实现?

我有一个模板课

template<typename T>
class D : public B {...}
Run Code Online (Sandbox Code Playgroud)

其中B是在类D中实现的纯虚拟接口。但是,对于一种类型T0,实现具有附加数据和处理此数据的附加成员函数。因此,在这种情况下,我必须专门研究D类:

template<>
class D<T0> : public B {...}
Run Code Online (Sandbox Code Playgroud)

同时,此专业化中所有其他方法的实现与通用情况完全相同,我不想复制粘贴它。问题是,如果可能的话,如何从类中调用类D中的泛型实现D<T0>

PS。当然,正如@MaxLanghof和@Klaus所建议的那样,有一个具有中间派生类C的解决方案。但是,在此解决方案中,可以实例化C<T0>我不想要的class 。如果没有其他解决方案,那么我将使用该解决方案。也许在C ++ 11/14中,有一些现代的构造可以在这种情况下提供帮助?

template-specialization c++11

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