小编cut*_*CAT的帖子

如何知道附加的windowstation是否是交互式的?

我正在编写一个程序,可以由另一个服务(在我们的控制下)或登录用户加载.程序需要知道窗口站是否是交互式的,以便显示对话框.我知道GetProcessWindowStation函数,但是这个函数返回一个句柄.有没有办法找出来?

c++ windows winapi

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

关于二维阵列

我在使用二维数组时遇到了一些问题.

static const int PATTERNS[20][4];

static void init_PATTERN()
{
   // problem #1
   int (&patterns)[20][4] = const_cast<int[20][4]>(PATTERNS);  
   ...
}

extern void UsePattern(int a, const int** patterns, int patterns_size);

// problem #2
UsePattern(10, PATTERNS, sizeof(PATTERNS)/sizeof(PATTERNS[0]));
Run Code Online (Sandbox Code Playgroud)

在第一个语句中,我需要抛出const二维数组PATTERNS.原因是init函数只被调用一次,而在剩下的代码中,它PATTERNS是严格只读的.

在第二个语句中,我需要将PATTERNS数组传递给int**参数.直接传递导致编译错误.


我已经解决了这个问题,就在@Andrey发布答案的同一时间.是的int[][],无法投入int**.

它可以int*通过传递&(PATTERNS[0][0]),并且必须使用行大小(行中元素的数量)修改函数原型.该数组可以const_cast使用参考语法.

c++ multidimensional-array

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

Qt:将基类方法引入派生类的槽中

我有一个派生自QWidget和模型类的类.根据我的阅读,我不能让模型类从QObject派生.

class PageWidget : public QWidget,
        public MyModelClass
{
...
};
Run Code Online (Sandbox Code Playgroud)

模型类MyModelClass已经有了设置setWidth(bool)等属性的方法.似乎我不能直接将这些方法用作插槽.如果我宣布:

QObject :: connect(按钮,SIGNAl(dataChanged(bool)),这个,SLOT(setWidth(bool)));

Qt在运行时抱怨没有插槽setWidth(bool).我必须手动将每个方法添加到PageWidget中,而PageWidget只调用MyModelClass的相同方法.

有没有办法将基本方法放入插槽而不重新声明每个方法?

qt signals-slots qobject

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

DllMain内部没有断开的开关/外壳

我有一个Dllmain,当一个线程附加到这个DLL时,它分配Thread本地存储.代码如下:

BOOL APIENTRY DllMain(HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved)
{
    LPVOID lpvData; 
    BOOL fIgnore; 

    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
        onProcessAttachDLL();
        // Allocate a TLS index.
        if ((dwTlsIndex = TlsAlloc()) == TLS_OUT_OF_INDEXES) 
            return FALSE; 
        // how can it jump to next case???
    case DLL_THREAD_ATTACH:
        // Initialize the TLS index for this thread.
        lpvData = (LPVOID) LocalAlloc(LPTR, MAX_BUFFER_SIZE); 
        if (lpvData != NULL) 
            fIgnore = TlsSetValue(dwTlsIndex, lpvData);  
        break; 
    ...
Run Code Online (Sandbox Code Playgroud)

}

我知道对于主线程,根据Microsoft文档,未输入DLL_THREAD_ATTACH.但是,上面的代码有效.我使用的是VC2005.当我进入调试器时,我看到在ul_reason_for_call = 1后输入DLL_THREAD_ATTACH的情况!怎么会发生这种情况?如果我在DLL_PROCESS_ATTACH块的末尾添加"break",则DLL无法工作.

怎么会发生这种情况?

c dll winapi switch-statement

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