Articles of Windows

如何查看DLL函数?

我有一个我想查看的DLL文件。 我想查看在该DLL中使用的function,任何人都可以帮助我?

在Delphi的Windows API参数 – 传递var参数有或没有@运营商?

我试图使用一个函数调用SetupDiGetDeviceRegistryProperty与delphi7.该调用是从示例函数SetupEnumAvailableComPorts 。 它看起来像这样: SetupDiGetDeviceRegistryProperty( DevInfoHandle, DeviceInfoData, RegProperty, @PropertyRegDataType, nil, 0, @RequiredSize ); 我在参数@PropertyRegDataType和@RequiredSize上收到错误“实际和forms参数的types必须相同”。 这些参数被声明: var RequiredSize: Cardinal; PropertyRegDataType: DWORD; MSDN将这些参数描述为: “RequiredSize [out,optional]指向DWORDtypesvariables的指针,该variables接收所需大小(以字节为单位)的PropertyBuffer缓冲区,该缓冲区用于保存请求属性的数据。并且可以为NULL。 “和”PropertyRegDataType [out,optional]指向一个variables的指针,该variables接收正在检索的属性的数据types,这是标准的registry数据types之一,该参数是可选的,可以是NULL “。 SetupDiGetDeviceRegistryProperty(来自JVCL的 SetupAPI.pas中)的声明如下所示: function SetupDiGetDeviceRegistryProperty( DeviceInfoSet: HDEVINFO; const DeviceInfoData: TSPDevInfoData; Property_: DWORD; var PropertyRegDataType: DWORD; PropertyBuffer: PBYTE; PropertyBufferSize: DWORD; var RequiredSize: DWORD ): BOOL; stdcall; {$EXTERNALSYM SetupDiGetDeviceRegistryProperty} 由于PropertyRegDataType和RequiredSize是var参数,因此应该能够在不使用@运算符的情况下传递。 实际上,如果我从函数调用参数中删除了@操作符,代码将会编译,但是会与访问冲突(读取地址0)一起崩溃。 原来的代码是为Delphi 7编写的,为什么他们会在这些参数上使用@运算符? […]

从C ++函数返回string到JavaScript

我有一个实现了IDispatch接口的类(JSObject)。 该类暴露于运行在我的托pipe的Web浏览器控件(IWebBrowser2)中的JavaScript。 在这里看到更多关于这是如何工作的: 调用Web浏览器控件中运行的JavaScript脚本的C ++函数 我可以从我的JavaScript代码中调用JSObject,并且可以接收返回的整数/多个。 但是当函数返回一个string(BSTR)时会出错。 这是IDispatch::Invoke()代码的一部分: int lenW = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, "Returned string", -1, NULL, 0); BSTR bstrRet = SysAllocStringLen(0, lenW); MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, "Returned string", -1, bstrRet, lenW); pVarResult->vt = VT_BSTR; pVarResult->bstrVal = bstrRet; // Who calls SysFreeString(bstrRet);? 通过上面的代码,你可以alert()返回的string,但是你不能添加它。 alert(returnedString + "foo"); 只会显示“返回的string”。 “foo”部分不会添加到string中。 这个string的结尾似乎有些问题。 任何想法的人? 另外,我在这里泄漏内存,因为我没有调用SysFreeString() ? 编辑: 我暂时包含atlbase.h,所以我可以使用CComBSTR 。 上面的代码现在看起来像这样: pVarResult->vt […]

系统调用窗口和原生API?

最近我在* NIX操作系统中使用了很多汇编语言。 我想知道的Windows域。 在linux中调用约定: mov $SYS_Call_NUM, %eax mov $param1 , %ebx mov $param2 , %ecx int $0x80 而已。 这就是我们应该如何在Linux中进行系统调用。 在Linux中引用所有的系统调用: 关于哪个$ SYS_Call_NUM&我们可以使用这个参考: http ://docs.cs.up.ac.za/programming/asm/derick_tut/syscalls.html 官方参考: http : //kernel.org/doc/man-pages/online/dir_section_2.html 在Windows中调用约定: ??? 在Windows中引用所有系统调用: ??? 非官方的: http : //www.metasploit.com/users/opcode/syscalls.html ,但我怎样才能在汇编中使用这些,除非我知道调用约定。 官方:??? 如果你说,他们没有logging。 那么如何在不知道系统调用的情况下为Windows编写libc? 如何做一个Windows汇编程序devise? 至less在驱动程序编程中需要知道这些。 对? 现在,所谓的Native API呢? 本Native API和System calls for windows都是不同的术语是指同一件事情? 为了证实我比较了这两个非官方来源 系统调用: http : //www.metasploit.com/users/opcode/syscalls.html […]

从.NET Windows服务调用本地DLL失败

我有一个使用DllImport从C#调用的原生dll格式的第三方API。 这个本地DLL取决于正在打开的第三方应用程序。 当我正常运行代码时,API将执行预期的操作并驱动应用程序。 但是,当我作为Windows服务运行相同的代码时,即使在我自己的情况下,API也会返回我在应用程序closures时看到的相同(未logging的)错误代码; 进程资源pipe理器确认本地dll是从应用程序目录正确加载的。 有什么可能导致这个问题,我怎么能解决这个问题?

确切地说Git Bash for Windows'提示符被定义?

我的办公室和家用电脑都有Git Bash for Windows来源于同一个源码(Git for Windows,TortoiseGit附带),但是Git Bash的提示符在两台机器上都有所不同: 在办公室电脑上我有/c/path (branch)全是绿色的(这是,我怎么想它), 在家用电脑上,我只有path(不分支)和全白。 直到现在我被告知,这是PS1variables,保存在~/.bashrc文件中。 但是,在这两台机器上,这个文件丢失了(执行notepad ~/.bashrc打开空的记事本)。 我迷路了 如果~/.bashrc不存在,那么从哪里Git Bash“知道”,它应该显示当前分支,在绿色提示? 为什么在第二台机器上不会发生这种情况? 编辑 : 我也试图比较两个机器和Git Bash.vbs文件的内容的c:\Program Files\Git\etc\文件夹内容。 在两台计算机上都是一样的,所以我甚至不知道Git Bash的提示符在两台计算机上是不同的(以及如何解决这个问题)。 几个答案(像这样 , 这个和这个 )已经提示我,我应该寻找.bash_profile和.bash_prompt文件。 不幸的是,我的两台电脑上都没有这两个。 究竟是什么文件决定在Windows 7下呢? 我应该在哪里寻找什么, PS1variables的值应该是什么,在两台机器上显示绿色提示的当前分支?

Git for Windows中的Bash:运行带有args的CMD.exe / C命令时出现奇怪

这更多的是一个烦恼,而不是一个问题,但我非常想了解这里的语义。 我所要做的就是在临时命令提示会话上运行一个任意命令,该会话本身在bash会话下运行。 我的成功率是50/50,因为一些命令按预期工作,而另一些则不是那么多。 我认为这个问题可能存在于没有正确排列的论点(即缺失或合并的论点) 我会试着通过一系列命令和回应来解释我的意思。 (我试图让字testing被打印在屏幕上。) 我在GNU bash 3.1.0(1) – 版本(i686-pc-msys)下运行这些版本与Git-1.8.4捆绑在一起: 第一次尝试: $ cmd /c echo test Microsoft Windows [Version 6.1.7601] Copyright (c) 2009 Microsoft Corporation. All rights reserved. c:\> 第二次尝试: $ cmd '/c echo test' test" 第三次尝试: $ cmd "/c echo test" test" 第四次尝试: $ cmd /c\ echo\ test test" 第五次尝试: $ cmd "/c […]

multithreadingbatch file传递参数

multithreading部分已经在这里回复,并且工作得很好(非常感谢Magoo ) 主要代码 SET /a instances=%NUMBER_OF_PROCESSORS% :: make a tempfile :maketemp SET "tempfile=%temp%\%random%" IF EXIST "%tempfile%?" (GOTO maketemp) ELSE (ECHO.>"%tempfile%a") :: :loop SET "nextfile=%~1" IF NOT DEFINED nextfile ( DEL "%tempfile%a*" >NUL 2>NUL ::ECHO all done exit ) FOR /L %%a IN (1,1,%instances%) DO ( IF NOT EXIST "%tempfile%a%%a" ( >"%tempfile%a%%a" ECHO. START /B "Instance […]

find一个Windows用户的“真实”的应用程序数据文件夹?

我有一个Delphi 6应用程序,像大多数Windows应用程序一样,将数据读取/写入用户的“本地应用程序数据”文件夹。 我使用下面的代码来确定该文件夹。 到目前为止,该代码为我的大多数用户工作。 我遇到了本地应用程序数据不在预期文件夹中的用户: C:\Users\Bob\AppData\Roaming\ 通常,本地应用程序数据文件夹parsing为: C:\Documents and Settings\Bob\Application Data\ 这个用户特殊情况的奇怪之处在于通常在HKEY_LOCAL_MACHINE中find的几个registry项实际上位于HKEY_CURRENT_USER中。 他们在Windows 7上运行。 缺乏一个更好的词,有没有办法让用户“真正”的应用程序数据,所以我可以更好地浏览这种情况? 如果是在CSIDL_APPDATA,CSIDL_COMMON_APPDATA和CSIDL_LOCAL_APPDATA特殊文件夹之间进行智能select,那么这样做的逻辑是什么? 正如您所看到的,我正在寻找一种通用function,无论用户正在运行的Windows版本或其特定的PCconfiguration如何,都可以find正确的应用程序数据文件夹。 我发现这个堆栈溢出post似乎有答案,但它使用.NET库中的函数,我正在使用Delphi 6.如果这个解决scheme回答我的问题,有人可以告诉我一个快速的方法来复制它在Delphi中: 我怎样才能得到当前用户的“应用程序数据”文件夹的path? // Function to get the app data special folder. function GetAppdataFolder: string; begin Result := GetSpecialFolderLocation(CSIDL_APPDATA); end;

EnumWindows返回句柄的顺序是否有意义?

从几个初步的testing看来, EnumWindows总是以反向实例顺序返回窗口,即最近实例化的窗口。 这是一个有效的观察? 如果是这样,所有版本的Windows都是真的吗? 这是一个可靠的假设,也就是说,行为logging在某个地方? 上下文: 我正在处理的情况是,我正在触发第三方应用程序来打开几个非模式窗口,我需要发送一些窗口消息到这些窗口打开,但我没有确定的方式确定他们的窗口类别和他们的标题不会有所不同,我也不知道他们的预期坐标。 但是,如果我可以依靠EnumWindows的上述行为,我可以简单地使用由EnumWindows返回的第一个句柄,它们的类和标题符合我的期望。 这仍然留下一些假设的循环漏洞,但我认为这将是足够好的。 不过,欢迎提供其他build议。