↖水☆晶▲显㊣灵↗
速抄下球里发出的那个光。
传原原Po在批踢踢之C_and_CPP版发问此问题:“
为什么用findwindow找combobox的handler都找不到,可是button却可以??
”
并于遭到质疑后附上了程式码片段:“
IntPtr mWin = FindWindow("ThunderRT6FormDC", "POSDLLDemo");
IntPtr mFrame = FindWindowEx(mWin, IntPtr.Zero, "ThunderRT6Frame", "Port Config");
currChild = FindWindowEx(mFrame, prevChild, "ThunderRT6ComboBox", "COM1");
”
神旨传令快,如有抄错请见谅。
让我们重现一下历史,请看:
首先他说是用C++写的,好,再来他用到了今天令众生起蒸液的IntPtr,
也就是说这是一个用到.net Framework,或者说得更精确,是C++/CLI的程式。
如何在Visual Studio上建立一个C++/CLI的专案呢?
首先开启Visual Studio,按下“New Project”,语言选择“Visual C++”,
接着从“CLR”建立一个“CLR Console Application”。
http://i.imgur.com/6oPxs8E.png
出来了!杰尼……不对,出来了!程式码。
http://i.imgur.com/ZREqNEz.png
我们发现原PO使用的攻击技能是Windows API,
Windows的API都是以C-style导出函数,
并出没在Windows上各种系统DLL,
比如今天的“FindWindow”以及“FindWindowEx”都是在“user32.dll”中,
怎么知道神奇宝贝的详细资料?看图鉴就对了!
Windows开发人员必备的图鉴就是“MSDN”,让我们来看看:
FindowWindow在
https://msdn.microsoft.com/zh-tw/library/windows/desktop/ms633499(v=vs.85).aspx
缩:http://bit.ly/FindWindow
FindWindowEx在
https://msdn.microsoft.com/zh-tw/library/windows/desktop/ms633500(v=vs.85).aspx
缩:http://bit.ly/FindWindowEx
我们将网页往下滑找到“Requirements”的表格,
就可以看到这里有说明此API位在哪个DLL,要引用哪个header,支援的系统版本等。
好,查完了图鉴,就可以开始收服了!
首先在.net中想要呼叫外部DLL的函数,必须用到一项技术叫“Platform invoke”,
有时也会看到“P/Invoke”这样的写法,
虽然C++/CLR可以直接#include <Windows.h>来呼叫Windows API,
但是这样就无法在不用转型的状况下重现IntPtr了。
要呼叫Unmanaged DLL提供的函数,必需定义他的名称、参数,以及DLL,
但首先必须 using namespace System::Runtime::InteropServices;
[DllImport ("user32")]
IntPtr FindWindow(String ^, String ^);
[DllImport ("user32")]
IntPtr FindWindowEx(IntPtr, IntPtr, String ^, String ^);
我已省略参数名称,如不确定还是可以上MSDN查询。
接着就可以把程式贴上去看看会发生什么事了。
https://i.imgur.com/k3P3670.png
看到了吗?可是,瑞凡,你……
什么!?“IntPtr.Zero”,这不是C#吗?
好的,辛苦了这么久,原来是C#啊,我还以为是C++……除非是用打的笔误。
完。
后记:
如果是C++的话,应该打“IntPtr::Zero”才对。
附上完整程式码:https://i.imgur.com/IHnATV4.png