我正在编写一个程序,可以由另一个服务(在我们的控制下)或登录用户加载.程序需要知道窗口站是否是交互式的,以便显示对话框.我知道GetProcessWindowStation函数,但是这个函数返回一个句柄.有没有办法找出来?
我在使用二维数组时遇到了一些问题.
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
使用参考语法.
我有一个派生自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的相同方法.
有没有办法将基本方法放入插槽而不重新声明每个方法?
我有一个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无法工作.
怎么会发生这种情况?