Articles of winapi

如何使用IDispatch.Invoke调用接收浮点值的函数?

我无法使用IDispatch.Invoke调用具有浮点参数和浮点结果的函数。 这是一个最小的复制: #include <atlbase.h> #include <comutil.h> int main(int argc, char* argv[]) { CoInitialize(NULL); CComPtr<IDispatch> wordapp; if (SUCCEEDED(wordapp.CoCreateInstance(L"Word.Application", NULL, CLSCTX_LOCAL_SERVER))) { CComVariant result; CComVariant centimeters((float)2.0); CComVariant retval = wordapp.Invoke1(L"CentimetersToPoints", &centimeters, &result); } return 0; } 我正在使用ATL CComPtr使事情更清洁。 但是这是IDispatch.Invoke的一个非常宽松的包装。 当我运行这个,调用Invoke1失败并返回E_FAIL 。 我怀疑这个问题与使用浮点参数和/或返回值有关。 如果我调用一个不使用这些值的函数,调用将成功: CComVariant retval = wordapp.Invoke0(L"ProductCode", &result); 我注意到,如果我从VBS或从PowerShell调用函数,它会成功。 我假设他们都使用迟来的IDispatch ,所以这将表明,我正在尝试是至less有可能的。 那么,如何使用IDispatch来调用这个函数呢?

如何让屏幕在Windows中缩放?

我正在写一个Windows程序,让用户切换1920×1080和3840×2160之间的分辨率,这意味着在FHD和4K之间。 我试图使用“GetSystemMetrics”来获得当前的解决scheme。 //Algorithm #1 //Get current resolution and resolution scaling. xScreenResolution = GetSystemMetrics(SM_CXSCREEN); yScreenResolution = GetSystemMetrics(SM_CYSCREEN); cout << "Current Resolution is: " << xScreenResolution << "x" << yScreenResolution << endl; 例如,如果我使用3840 * 2160的分辨率,我预计程序会给我3840 * 2160的分辨率。 但是,该程序只输出1536×864,这是Windows执行重新缩放后的分辨率。 所以我想知道如何获得比例因子(100%,200%,250%等),如Windows 10中的显示设置 。Windows 10中的显示设置

当“更改用户”时,CreateProcessAsUser不起作用

首先,我要感谢所有为这个网站工作的人,对开发人员非常有用。 这是我3天以来第一次受到阻挠。 我在互联网上search的解决scheme,但我找不到解决这个问题。 所以,我开发了一个服务,当用户login时,必须在vista / 7 / xp上执行一个外部程序。 这项服务的一些特点: 自动 没有互动性。 检测login用户的会话标识 以交互式用户身份运行外部GUI应用程序: 为了确保打开用户会话,我列出了所有“explorer.exe”进程,使用msdn函数ProcessIdToSessionId提取它们的Pid和SessionID 如果login用户的SessionID与此“explorer.exe”进程的会话ID相同,我确信“good”桌面正在运行,所以现在我可以执行外部程序。 (我说“好”的桌面,因为如你所知,可以在系统上打开多个用户会话) 之后,我用这个函数运行应用程序: function RunInteractive(prog_filename: String; sessionID: Cardinal): boolean; var hToken: THandle; si: _STARTUPINFOA; pi: _PROCESS_INFORMATION; begin ZeroMemory(@si, SizeOf(si)); si.cb := SizeOf(si); SI.lpDesktop := nil; if WTSQueryUserToken(sessionID, hToken) then begin if CreateProcessAsUser(hToken, nil, PChar(prog_filename), nil, nil, False, 0, nil, PChar(ExtractFilePath(prog_filename)), si, […]

我如何使用C ++从RAM运行可执行文件?

我如何使用C ++从RAM运行可执行文件? 可执行文件在RAM中,我知道地址,我怎样从我的程序中调用程序?

RegSvr32退出代码文档?

我玩RegSvr32.exe注册一个COM服务器,并获得下一个退出代码: 0 – 正确注册正常的DLL Com服务器 3 – 尝试注册假DLL Com服务器(简单的文本文件重命名为.DLL 4 – 当尝试注册简单的DLL,而不是通讯服务器 问题:我可以在哪里find所有可能的退出代码及其含义的官方(或非官方的,但是很好的)描述? search在互联网上没有给我的结果,所以我发现这个主题写在退出代码是一样的Windows系统错误代码,但我不明白为什么然后当尝试注册坏文件我正在获取代码= 3 = ERROR_PATH_NOT_FOUND ,并注册非COM DLL时 – 4 = ERROR_TOO_MANY_OPEN_FILES ? 对我来说,这听起来不合逻辑。

Windows服务与GUI监视器?

我有一个作为Windows GUI项目编写的C ++ Win32应用程序,现在我试图弄清楚将它变成一个服务/ GUI混合。 我知道一个Windows服务不能/不应该有一个用户界面。 但请允许我解释我到目前为止以及我所拍摄的内容。 我现在有什么是一个Windows应用程序。 运行时,它会在系统托盘中放置一个图标,您可以双击打开该图标。 此应用程序的目的是处理夜间计划中指定目录中的文件。 GUI包含以下内容: 一个button来手动启动一个不定期的扫描/处理。 一个button来打开一个对话框来修改设置。 列表框用于显示处理线程发送的状态消息。 用于显示图像数据的自定义绘制窗口(文件处理包括图像的创build和保存)。 状态栏 – 当进程没有运行时,它显示下一个计划扫描的倒计时。 在扫描期间,它还提供一些状态反馈,包括进度条。 我正在拍摄的是一个在启动时运行的服务,不需要用户login。 这将包含预定的文件处理。 但是,当用户login时,我仍然想要加载托盘图标,并允许他们打开一个GUI,如上所述,以监视服务的当前状态,更改设置,手动启动扫描以及监视进度的扫描。 我确定我已经看到了这样的应用程序 – 即使在我没有login的情况下也可以作为服务使用,但是一旦我login,仍然可以给我一个用户界面。 我在想,不是有一个multithreading应用程序从处理线程向GUI线程发送消息,我需要两个应用程序 – 一个服务来执行处理和一个GUI应用程序,以提供来自服务的可视反馈发送消息到服务(例如,手动开始扫描)。 但是我对Windows服务不熟悉,不知道这是如何完成的。 也有可能我完全脱离了基地,服务不是我一直在寻找的。 任何帮助/想法/build议将不胜感激! 谢谢。

挂钩窗口login/注销事件

我有一个服务将在系统级运行。 现在,我想跟踪login的用户。 之前我试图从GetUserName api获取login的用户名,但在我的情况下,它每次都返回“SYSTEM”。 无论如何,在我的情况下login用户名? 还是有任何钩子,我可以安装,以便我可以得到哪个用户login? PS:我主要在Delphi 2007中工作,但这些问题都是针对Win32 API的。

无法安装Windows 7 SDK(需要已安装.NET Framework 4)

我试图在Windows 8和Windows 10机器上安装Windows 7 SDK,并得到这个错误: 如果我点击确定,我不能安装我需要的VC ++编译器,因为它们被禁用=( 在这个错误之后,我尝试安装.NET 4,并得到这个错误: 如何解决它? 有时候我可以在Windows 8上安装这个SDK,但是大多数情况下我都看到这些消息。

获取鼠标指针下方的窗口句柄,同时忽略半透明窗口

我已经创build了一个半透明的窗体(60%的不透明度与黑色背景颜色),我的应用程序启动,最大化,在整个屏幕上。 基本上,它在整个桌面上投射灰色。 当用户将鼠标hover在桌面上的某个窗口上时,我想获取该窗口的句柄(hWnd)。 做这个工作的简单方法是: 暂时隐藏我的表单(或者,暂时将我的表单的不透明度设置为0.0) 调用[GetCursorPos] [1] 调用[WindowFromPoint] [2] 再次显示我的表单 这种方法的问题是我的表单/屏幕闪烁,我不喜欢。 我试图用两种方法解决这个问题: 我认为应该有办法通过调用ChildWindowFromPointEx (传递桌面和CWP_SKIPTRANSPARENT的hWnd),直接在窗体的窗口下获得窗口的hWnd,但似乎没有工作。 我也玩过[ChildWindowFromPoint] [4]和[RealChildWindowFromPoint] [5],但没有成功。 (PS Raymond Chen讨论了这些调用之间的差异, 在这里 ,我认为ChildWindowFromPointEx被devise为完成我所需要的) 我试图通过使用(1) SendMessage(GetDesktopWindow(), WM_SETREDRAW, false, 0)在我隐藏我的表单和(2) SendMessage(GetDesktopWindow(), WM_SETREDRAW, true, 0) SendMessage(GetDesktopWindow(), WM_SETREDRAW, false, 0)之前防止整个桌面刷新(types的“冻结”屏幕瞬间SendMessage(GetDesktopWindow(), WM_SETREDRAW, true, 0)隐藏我的表单后。 这不是很正确:屏幕的某些区域会冻结,会出现一些奇怪的黑色块,但是我知道,(1)确实有用,因为有一次我打电话给(1),没有(2)和我的桌面出现完全冻结(不得不重新启动,即使TaskMgr没有正确呈现)。 我也尝试过在窗体上使用SuspendLayout和ResumeLayout,但我不认为它们是为了处理我的情况。 任何帮助将不胜感激。

如何判断一个Windows PE文件是一个控制台子系统还是一个Windows子系统编程?

基本上我需要一个程序,将从控制台对应窗口sortingWindows.exe。 一个文件扫描仪: SortExe(file exe) { if (IsPeWindows(exe)) { AddToList1(exe); } else if (IsPeConsole()) { AddToList2(exe); } } 我如何实现IsPeWindows或IsPeConsole()? 只要是c,c ++,c#或visual basic的语言解决scheme之一,我并不特别在意。