<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:admin="http://webns.net/mvcb/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns="http://purl.org/rss/1.0/">
<channel rdf:about="https://www.rickw.cn/">
<title>Rick 's BLOG</title>
<link>https://www.rickw.cn/</link>
<description>Rick 's BLOG</description>
<dc:language>zh-cn</dc:language>
<dc:creator>redcheek@gmail.com</dc:creator>
<items>
<rdf:Seq>
<item rdf:about="https://www.rickw.cn/blogview/70">
<title><![CDATA[VC VB 的混合编译(三)]]></title>
	
<description><![CDATA[在上一回我们已经实现VB调用VC函数并传递一个long、窗口句柄、字符串指针、结构体指针的参数，并取得了函数的返回值。&amp;nbsp;这一回我们将实践一下如何传递多个参数。&lt;br&gt;打开上一回的两个工程(LinkWithVC,&amp;nbsp;vcobj).&amp;nbsp;切换到VB在form上添加一个按钮&amp;nbsp;name:&amp;nbsp;cmdTestStruct2,&amp;nbsp;标题&amp;nbsp;Test&amp;nbsp;Struct&amp;nbsp;2。再在ModVC中添加如下代码&lt;br&gt;Public&amp;nbsp;Function&amp;nbsp;TestArg(lppt1&amp;nbsp;As&amp;nbsp;POINTAPI,&amp;nbsp;lppt2&amp;nbsp;As&amp;nbsp;POINTAPI)&amp;nbsp;As&amp;nbsp;Long&lt;br&gt;Rem&lt;br&gt;End&amp;nbsp;Function]]></description>
<content:encoded><![CDATA[在上一回我们已经实现VB调用VC函数并传递一个long、窗口句柄、字符串指针、结构体指针的参数，并取得了函数的返回值。&nbsp;这一回我们将实践一下如何传递多个参数。<br />
打开上一回的两个工程(LinkWithVC,&nbsp;vcobj).&nbsp;切换到VB在form上添加一个按钮&nbsp;name:&nbsp;cmdTestStruct2,&nbsp;标题&nbsp;Test&nbsp;Struct&nbsp;2。再在ModVC中添加如下代码<br />
Public&nbsp;Function&nbsp;TestArg(lppt1&nbsp;As&nbsp;POINTAPI,&nbsp;lppt2&nbsp;As&nbsp;POINTAPI)&nbsp;As&nbsp;Long<br />
Rem<br />
End&nbsp;Function<br />
在cmdTestStruct2的Click事件中<br />
Private&nbsp;Sub&nbsp;cmdTestStruct2_Click()<br />
Dim&nbsp;pt1&nbsp;As&nbsp;POINTAPI,&nbsp;pt2&nbsp;As&nbsp;POINTAPI<br />
Call&nbsp;TestArg(pt1,&nbsp;pt2)<br />
MsgBox&nbsp;"x=&nbsp;"&nbsp;&amp;&nbsp;pt1.x&nbsp;&amp;&nbsp;"&nbsp;y="&nbsp;&amp;&nbsp;pt1.y&nbsp;&amp;&nbsp;vbCrLf&nbsp;&amp;&nbsp;"x=&nbsp;"&nbsp;&amp;&nbsp;pt2.x&nbsp;&amp;&nbsp;"&nbsp;y="&nbsp;&amp;&nbsp;pt2.y<br />
End&nbsp;Sub<br />
好，现在生成EXE，必然不成功。我们打开log看会是什么错误信息，<br />
Microsoft&nbsp;(R)&nbsp;Incremental&nbsp;Linker&nbsp;Version&nbsp;6.00.8447<br />
Copyright&nbsp;(C)&nbsp;Microsoft&nbsp;Corp&nbsp;1992-1998.&nbsp;All&nbsp;rights&nbsp;reserved.<br />
<br />
Form1.OBJ&nbsp;:&nbsp;error&nbsp;LNK2001:&nbsp;unresolved&nbsp;external&nbsp;symbol&nbsp;"private:&nbsp;void&nbsp;__stdcall&nbsp;ModVC::TestArg(void)"&nbsp;(?TestArg@ModVC@@AAGXXZ)<br />
F:\LinkWithVC\LinkWithVC.exe&nbsp;:&nbsp;fatal&nbsp;error&nbsp;LNK1120:&nbsp;1&nbsp;unresolved&nbsp;externals<br />
我们看到连接器要求的函数声明和&nbsp;无参数，1&nbsp;个参数的相同，经过测试不能在VB模块声明的函数有多少个参数编译后都是&nbsp;private:&nbsp;void&nbsp;__stdcall&nbsp;FunctionName(void&nbsp;)&nbsp;。<br />
好了我们熟练的在VC的类中加上对应的TestArg函数。编译，生成EXE，通过。<br />
下面来解决我们的难题，现在我们从VC程序的角度来说&nbsp;函数声明是一样的参数个数却是不确定的。这时我们应该会想到C&nbsp;函数中有一种可变参数的函数，这种函数要求至少有一个确定参数，然后使用一组宏获取其它参数。这里我们先复习一下&nbsp;C语言中可变参数的用法&nbsp;<br />
http://rickw.cn/blogview.asp?logID=67<br />
复习完了我们知道函数该怎么写了，如下：<br />
void&nbsp;ModVC::TestArg()<br />
{	<br />
	LPPOINT&nbsp;lppt1,lppt2;<br />
	va_list&nbsp;ap;<br />
	lppt1&nbsp;=&nbsp;(LPPOINT)this;<br />
	va_start(ap,this);<br />
	lppt2&nbsp;=&nbsp;va_arg(ap,LPPOINT);<br />
	lppt1-&gt;x&nbsp;=&nbsp;123;<br />
	lppt1-&gt;y&nbsp;=&nbsp;456;<br />
	lppt2-&gt;x&nbsp;=&nbsp;321;<br />
	lppt2-&gt;y&nbsp;=&nbsp;654;<br />
}&nbsp;<br />
这样子，能行吗，编译试试;<br />
-------------------Configuration:&nbsp;vcobj&nbsp;-&nbsp;Win32&nbsp;Release--------------------<br />
Compiling...<br />
ModVC.cpp<br />
F:\LinkWithVC\vcobj\ModVC.cpp(72)&nbsp;:&nbsp;error&nbsp;C2102:&nbsp;'&amp;'&nbsp;requires&nbsp;l-value<br />
Error&nbsp;executing&nbsp;cl.exe.<br />
<br />
ModVC.obj&nbsp;-&nbsp;1&nbsp;error(s),&nbsp;0&nbsp;warning(s)<br />
显然编译失败了。<br />
This&nbsp;是一个&nbsp;r－value，无法取地址。现在我们知道只要取得了this的地址我们的问题就解决了。那怎么知道this的地址呢。。。不知道大家有什么好方法没有，老实说，我没有，如果谁有更好的方法别忘了告诉我一声哦。<br />
不过我有一个很笨的方法：跟踪调试程序在内存中找答案。<br />
为了便于调试我更改函数内容为如下：<br />
void&nbsp;ModVC::TestArg()<br />
{<br />
	char&nbsp;p[256];<br />
	lstrcpy(p,"break&nbsp;here!");<br />
	_asm&nbsp;mov&nbsp;eax,1;<br />
	_asm&nbsp;mov&nbsp;eax,2;<br />
	_asm&nbsp;mov&nbsp;eax,3;<br />
	_asm&nbsp;mov&nbsp;eax,this;<br />
	_asm&nbsp;mov&nbsp;eax,4;<br />
	_asm&nbsp;mov&nbsp;eax,5;<br />
	_asm&nbsp;mov&nbsp;eax,6;<br />
}<br />
编译，生成EXE。我们现在使用ollydbg来调试&nbsp;LinkWithVC.exe，打开这个程序，使用od的搜功能，搜索参考字符串，然后在&nbsp;break&nbsp;here!&nbsp;哪里设置一个断点。运行程序，点按钮，程序会在下面红色的地方中断。<br />
004012C0&nbsp;&nbsp;/$&nbsp;55&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PUSH&nbsp;EBP<br />
004012C1&nbsp;&nbsp;|.&nbsp;8BEC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;EBP,ESP<br />
004012C3&nbsp;&nbsp;|.&nbsp;81EC&nbsp;00010000&nbsp;&nbsp;SUB&nbsp;ESP,100<br />
004012C9&nbsp;&nbsp;|.&nbsp;8D85&nbsp;00FFFFFF&nbsp;&nbsp;LEA&nbsp;EAX,DWORD&nbsp;PTR&nbsp;SS:[EBP-100]<br />
004012CF&nbsp;&nbsp;|.&nbsp;68&nbsp;30604000&nbsp;&nbsp;&nbsp;&nbsp;PUSH&nbsp;LinkWith.00406030&nbsp;&nbsp;&nbsp;;&nbsp;/String2&nbsp;=&nbsp;"break&nbsp;here!"<br />
004012D4&nbsp;&nbsp;|.&nbsp;50&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PUSH&nbsp;EAX&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;|String1&nbsp;=&nbsp;0012F300<br />
004012D5&nbsp;&nbsp;|.&nbsp;FF15&nbsp;C0104000&nbsp;&nbsp;CALL&nbsp;DWORD&nbsp;PTR&nbsp;DS:[&lt;&amp;KERNEL32.lstrcpyA&gt;]&nbsp;;&nbsp;\lstrcpyA<br />
004012DB&nbsp;&nbsp;|.&nbsp;B8&nbsp;01000000&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;EAX,1<br />
004012E0&nbsp;&nbsp;|.&nbsp;B8&nbsp;02000000&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;EAX,2<br />
004012E5&nbsp;&nbsp;|.&nbsp;B8&nbsp;03000000&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;EAX,3<br />
004012EA&nbsp;&nbsp;|.&nbsp;8B45&nbsp;08&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;EAX,DWORD&nbsp;PTR&nbsp;SS:[EBP+8]<br />
004012ED&nbsp;&nbsp;|.&nbsp;B8&nbsp;04000000&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;EAX,4<br />
004012F2&nbsp;&nbsp;|.&nbsp;B8&nbsp;05000000&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;EAX,5<br />
004012F7&nbsp;&nbsp;|.&nbsp;B8&nbsp;06000000&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;EAX,6<br />
004012FC&nbsp;&nbsp;|.&nbsp;8BE5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;ESP,EBP<br />
004012FE&nbsp;&nbsp;|.&nbsp;5D&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;POP&nbsp;EBP<br />
004012FF&nbsp;&nbsp;\.&nbsp;C2&nbsp;0400&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RETN&nbsp;4<br />
看看上面蓝色的代码，如是我们知道那条绿色的代码对应的源程序就是&nbsp;mov&nbsp;eax,&nbsp;this;<br />
如是&nbsp;我们知道了this的地址就是&nbsp;[ebp+8].<br />
<br />
<br />
<img src="/images/download.gif" align="absmiddle" /><a target="_blank" href="/attachments/month_0504/eb5i_LinkWithVC_3.rar">点击下载此文件</a>]]></content:encoded>
<link>https://www.rickw.cn/blogview/70</link>
<dc:subject>VB相关</dc:subject>
<dc:creator>rick</dc:creator>
<dc:date>2005-04-11 10:11:49</dc:date>
</item>
		
<item rdf:about="https://www.rickw.cn/blogview/66">
<title><![CDATA[VC_VB的混合编译(二)实践进阶片]]></title>
	
<description><![CDATA[<a target="_blank" href="http://rickw.cn/blogview.asp?logID=65">在上一回我们已经实现VC,VB代码的混合编译</a>,并成功的在VB代码中调用了VC代码中的一个无参数的函数,并取得了函数的返回值.&amp;nbsp;这一回我们将实践一下如何调用带参数的函数.&lt;br&gt;打开上一会的两个工程(LinkWithVC,&amp;nbsp;vcobj).&amp;nbsp;切换到VB在form上添加一个按钮&amp;nbsp;name:&amp;nbsp;cmdTestLong,&amp;nbsp;标题&amp;nbsp;TestLong.&amp;nbsp;在form上添加一个文本框txtInput&amp;nbsp;内容填&amp;nbsp;8.&amp;nbsp;再在ModVC中添加如下代码:&lt;br&gt;Public&amp;nbsp;Function&amp;nbsp;TestLong(ByVal&amp;nbsp;lng&amp;nbsp;As&amp;nbsp;Long)&amp;nbsp;As&amp;nbsp;Long&lt;br&gt;TestLong&amp;nbsp;=&amp;nbsp;-1&lt;br&gt;End&amp;nbsp;Function]]></description>
<content:encoded><![CDATA[<a target="_blank" href="http://rickw.cn/blogview.asp?logID=65">在上一回我们已经实现VC,VB代码的混合编译</a>,并成功的在VB代码中调用了VC代码中的一个无参数的函数,并取得了函数的返回值.&nbsp;这一回我们将实践一下如何调用带参数的函数.<br />
打开上一会的两个工程(LinkWithVC,&nbsp;vcobj).&nbsp;切换到VB在form上添加一个按钮&nbsp;name:&nbsp;cmdTestLong,&nbsp;标题&nbsp;TestLong.&nbsp;在form上添加一个文本框txtInput&nbsp;内容填&nbsp;8.&nbsp;再在ModVC中添加如下代码:<br />
Public&nbsp;Function&nbsp;TestLong(ByVal&nbsp;lng&nbsp;As&nbsp;Long)&nbsp;As&nbsp;Long<br />
TestLong&nbsp;=&nbsp;-1<br />
End&nbsp;Function<br />
在cmdTestLong的Click事件中添加代码&nbsp;msgbox&nbsp;Testlong(clng(txtInput.Text))<br />
现在我们来生成EXE.&nbsp;显然生成会失败,打开log文件看看.<br />
Microsoft&nbsp;(R)&nbsp;Incremental&nbsp;Linker&nbsp;Version&nbsp;6.00.8447<br />
Copyright&nbsp;(C)&nbsp;Microsoft&nbsp;Corp&nbsp;1992-1998.&nbsp;All&nbsp;rights&nbsp;reserved.<br />
<br />
Form1.OBJ&nbsp;:&nbsp;error&nbsp;LNK2001:&nbsp;unresolved&nbsp;external&nbsp;symbol&nbsp;"private:&nbsp;void&nbsp;__stdcall&nbsp;ModVC::TestLong(void)"&nbsp;(?TestLong@ModVC@@AAGXXZ)<br />
F:\LinkWithVC\LinkWithVC.exe&nbsp;:&nbsp;fatal&nbsp;error&nbsp;LNK1120:&nbsp;1&nbsp;unresolved&nbsp;externals<br />
看到了吗,和第一次看到的错误Log除了函数名,完全是一样的……这时候想到了什么?&nbsp;参数呢?&nbsp;在VB代码中明明是有参数申明的啊?&nbsp;….先不管它,&nbsp;和上回一样在VC类中添加一个名为TestLong的同类型的空函数.&nbsp;编译vc的obj,再生成VB的EXE,运行点击&nbsp;TestLong按钮,&nbsp;我们看到msgbox提示8,&nbsp;和我们的参数8&nbsp;一样!!&nbsp;是巧合?&nbsp;试试&nbsp;改改&nbsp;txtInput&nbsp;中的数字.&nbsp;再点击TestLong按钮.&nbsp;我们会发现&nbsp;msgbox提示的和txtInput文本框中的数字是一样的.&nbsp;有了上回返回值的经验,&nbsp;而我们的函数什么也没有做,&nbsp;如是我们会知道&nbsp;这个参数就&nbsp;是存放在&nbsp;eax中的,&nbsp;好了到了这里&nbsp;我们知道怎么在VC代码中获取&nbsp;vb代码传递的参数了.&nbsp;可是在传递一个&nbsp;long&nbsp;型的数据&nbsp;有什么实际用途呢?&nbsp;&nbsp;一个&nbsp;long&nbsp;它就意味着&nbsp;一个长整形数字、一个句柄、一个指针….我们来看一个实际的例子。<br />
在Form上添加一个按钮cmdTestHwnd在按钮&nbsp;TestHwnd的&nbsp;Click事件中添加代码&nbsp;call&nbsp;TestLong(txtInput.hWnd)<br />
这里我们传递的是一个textbox的句柄。<br />
我在VC函数中添加如下代码<br />
void&nbsp;ModVC::TestLong()<br />
{<br />
	long&nbsp;hw;<br />
	_asm&nbsp;mov&nbsp;hw,eax;&nbsp;//取得参数(TextBox的句柄)<br />
	SetWindowText((HWND)hw,"VC:&nbsp;Hello&nbsp;VB");<br />
	<br />
}<br />
重复操作，生成我们的EXE，。。。我们会发现失败了，打开log看看。<br />
Microsoft&nbsp;(R)&nbsp;Incremental&nbsp;Linker&nbsp;Version&nbsp;6.00.8447<br />
Copyright&nbsp;(C)&nbsp;Microsoft&nbsp;Corp&nbsp;1992-1998.&nbsp;All&nbsp;rights&nbsp;reserved.<br />
<br />
ModVC.OBJ&nbsp;:&nbsp;error&nbsp;LNK2001:&nbsp;unresolved&nbsp;external&nbsp;symbol&nbsp;__imp__SetWindowTextA@8<br />
F:\LinkWithVC\LinkWithVC.exe&nbsp;:&nbsp;fatal&nbsp;error&nbsp;LNK1120:&nbsp;1&nbsp;unresolved&nbsp;externals<br />
熟悉VC的一看就知道连接的时候没有把User32.lib连接进去。<br />
解决方法有两个1个是在VC代码中使用LoadLibray,GetProcessAddress的方式调用这个api，另一个方法就是&nbsp;让连接器&nbsp;把user32.Lib连接进去。&nbsp;显然如果要大量使用api函数的话第一中方法太繁琐。我们用第二个方法。怎么做了呢？还记得上一回的&nbsp;自定义连接配置文件吗。<br />
[Settings]<br />
lib=1<br />
log=1<br />
<br />
[OBJ]<br />
F:\LinkWithVC\vcobj\Release\ModVC.obj=F:\LinkWithVC\ModVC.obj<br />
<br />
[lib]<br />
1=User32.lib<br />
Settings段的lib&nbsp;表示&nbsp;[lib]段中的lib数目。&nbsp;在lib段&nbsp;我按照顺序1=…,2=…&nbsp;添加我们要连接的lib即可，当然也可以是obj文件。<br />
好我们再来操作，生成EXE，OK。运行点击TestHwnd。好了我们看到TextBox中的文字变成了&nbsp;VC:&nbsp;Hello&nbsp;VB&nbsp;。<br />
我们再来试试字符串。<br />
在form上添加一个按钮TestString&nbsp;在ModVC中添加函数<br />
Public&nbsp;Function&nbsp;TestString(ByVal&nbsp;s&nbsp;As&nbsp;String)&nbsp;As&nbsp;Long<br />
Rem&nbsp;nothing<br />
End&nbsp;Function<br />
TestString的Click事件中添加如下代码<br />
Private&nbsp;Sub&nbsp;CmdTestString_Click()<br />
Dim&nbsp;s&nbsp;As&nbsp;String<br />
s&nbsp;=&nbsp;Space(256)&nbsp;'为s分配空间<br />
Call&nbsp;TestString(s)<br />
MsgBox&nbsp;s<br />
End&nbsp;Sub<br />
在VC中添加同名函数<br />
void&nbsp;ModVC::TestString()<br />
{<br />
	char*&nbsp;p;<br />
	_asm&nbsp;mov&nbsp;p,eax;&nbsp;//取得参数(TextBox的句柄)<br />
	memset(p,0,256);//我们知道字符串的长度是256<br />
	lstrcpy(p,"VC:&nbsp;Hello&nbsp;VB");<br />
	<br />
}<br />
编译，生成EXE，运行，点击TestString按钮，。。。咦，显示的是乱码！！？？这是因为VB中的String用的是Unicode，VC中复制的不是。转一下就可以了。就在vb中转吧vb有一个函数很方便。把msgbox&nbsp;s&nbsp;改为&nbsp;MsgBox&nbsp;StrConv(s,&nbsp;vbUnicode)，再生成EXE运行，这次OK了。<br />
接下来我们再试试传递结构体。函数参数格式的声明我们可以参考一下VB中API函数的声明。我来个简单点的结构体&nbsp;POINTAPI,&nbsp;用VB的&nbsp;API&nbsp;Viewer&nbsp;找到<br />
Public&nbsp;Declare&nbsp;Function&nbsp;GetCursorPos&nbsp;Lib&nbsp;"user32"&nbsp;(lpPoint&nbsp;As&nbsp;POINTAPI)&nbsp;As&nbsp;Long<br />
<br />
Public&nbsp;Type&nbsp;POINTAPI<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x&nbsp;As&nbsp;Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;y&nbsp;As&nbsp;Long<br />
End&nbsp;Type<br />
参这个我们在ModVC中添加函数<br />
Public&nbsp;Function&nbsp;TestStruct(lppt&nbsp;As&nbsp;POINTAPI)&nbsp;As&nbsp;Long<br />
Rem<br />
End&nbsp;Function<br />
在form上添加一个按钮TestStruct，在Click中添加代码<br />
Private&nbsp;Sub&nbsp;cmdTestStruct_Click()<br />
Dim&nbsp;pt&nbsp;As&nbsp;POINTAPI<br />
Call&nbsp;TestStruct(pt)<br />
MsgBox&nbsp;"x=&nbsp;"&nbsp;&amp;&nbsp;pt.x&nbsp;&amp;&nbsp;"&nbsp;y="&nbsp;&amp;&nbsp;pt.y<br />
End&nbsp;Sub<br />
在VC类中添加同名同类型函数。<br />
void&nbsp;ModVC::TestStruct()<br />
{<br />
	POINT&nbsp;*pt;<br />
	_asm&nbsp;mov&nbsp;pt,eax;//获取&nbsp;指针参数<br />
	pt-&gt;x&nbsp;=&nbsp;123;<br />
	pt-&gt;y&nbsp;=&nbsp;456;<br />
}<br />
编译运行。。。。我们会发现&nbsp;非法操作。大概是说引用了0x00000000处的内存。看这个内存地址我们会知道&nbsp;在vc中引用了一个空指针，那就是说eax的值是0。那则么回事参数没有在eax里面，参数跑哪里去了？在其它寄存器？不太可能。。。那会在哪里呢，我们总不能凭空变出来一个参数吧。想想C++类中有什么可以用的符号？嗯，有一个&nbsp;this&nbsp;指针。会是它吗，熟悉VC的人应该知道在调用类成员函数时会先将该类的this指针存放到&nbsp;eax&nbsp;中。看来他们有很大的关系。那就动手试试。函数改为如下：<br />
void&nbsp;ModVC::TestStruct()<br />
{<br />
	POINT&nbsp;*pt=(POINT)this;<br />
	pt-&gt;x&nbsp;=&nbsp;123;<br />
	pt-&gt;y&nbsp;=&nbsp;456;<br />
}<br />
再编译，生成EXE运行。OK！成功了，看到了&nbsp;x=&nbsp;123&nbsp;y=456&nbsp;.<br />
我们再回过头来看看前面的函数&nbsp;，都假设把this&nbsp;当着参数试试，经过测试假设成立。如是我们知道this&nbsp;就是传递过来的参数，当参数是long是，同时eax中也有这个参数值的一个副本。<br />
到现在看来似乎是大功告成了，还没有！还有一个难题，this就只有一个，如果要传递2个，3个，4个。。。参数怎么办呢？<br />
<br />
<img src="/images/download.gif" align="absmiddle" /><a target="_blank" href="/attachments/month_0504/rogu_LinkWithVC.rar">点击下载此文件</a>]]></content:encoded>
<link>https://www.rickw.cn/blogview/66</link>
<dc:subject>VB相关</dc:subject>
<dc:creator>rick</dc:creator>
<dc:date>2005-04-07 12:50:11</dc:date>
</item>
		
<item rdf:about="https://www.rickw.cn/blogview/65">
<title><![CDATA[VC_VB的混合编译(一) 原理片]]></title>
	
<description><![CDATA[原理:&lt;br&gt;Visual&amp;nbsp;Basic&amp;nbsp;从5.0起就可以象C++那样将程序编译成本地码.VB将程序中的每个form,&amp;nbsp;bas,&amp;nbsp;cls,&amp;nbsp;vbp&amp;nbsp;编译为obj文件,然后再调用连接程序将它们连接成EXE,&amp;nbsp;这个过程是自动的,连接完成后它会自动删除中介生成的OBJ文件.&amp;nbsp;要实现我们的目的就需要在连接程序连接输出EXE之前对OBJ文件进行处理,将C++编译的OBJ文件换进去.&lt;br&gt;准备:&lt;br&gt;我们需要自己些一个连接程序,当然这个程序不是要实现连接的功能,只需要实现&amp;nbsp;预先处理&amp;nbsp;OBJ&amp;nbsp;文件,&amp;nbsp;获取VB传递给连接程序的参数,&amp;nbsp;对参数进行&amp;nbsp;必要的修改,&amp;nbsp;然后&amp;nbsp;调用原连接程序&amp;nbsp;完成连接工作.&amp;nbsp;我们将vb目录下的Link.exe&amp;nbsp;改名为&amp;nbsp;vblink.exe,&amp;nbsp;再将我们写的link.exe&amp;nbsp;放到这个目录中.&amp;nbsp;这个Fake&amp;nbsp;Link&amp;nbsp;程序我已经完成了,&amp;nbsp;在压缩包包中可以找到.&amp;nbsp;&lt;br&gt;先讲讲这个Fake&amp;nbsp;Link&amp;nbsp;程序是怎么工作的:]]></description>
<content:encoded><![CDATA[原理:<br />
Visual&nbsp;Basic&nbsp;从5.0起就可以象C++那样将程序编译成本地码.VB将程序中的每个form,&nbsp;bas,&nbsp;cls,&nbsp;vbp&nbsp;编译为obj文件,然后再调用连接程序将它们连接成EXE,&nbsp;这个过程是自动的,连接完成后它会自动删除中介生成的OBJ文件.&nbsp;要实现我们的目的就需要在连接程序连接输出EXE之前对OBJ文件进行处理,将C++编译的OBJ文件换进去.<br />
准备:<br />
我们需要自己些一个连接程序,当然这个程序不是要实现连接的功能,只需要实现&nbsp;预先处理&nbsp;OBJ&nbsp;文件,&nbsp;获取VB传递给连接程序的参数,&nbsp;对参数进行&nbsp;必要的修改,&nbsp;然后&nbsp;调用原连接程序&nbsp;完成连接工作.&nbsp;我们将vb目录下的Link.exe&nbsp;改名为&nbsp;vblink.exe,&nbsp;再将我们写的link.exe&nbsp;放到这个目录中.&nbsp;这个Fake&nbsp;Link&nbsp;程序我已经完成了,&nbsp;在压缩包包中可以找到.&nbsp;<br />
先讲讲这个Fake&nbsp;Link&nbsp;程序是怎么工作的:<br />
首先&nbsp;程序取得&nbsp;VB&nbsp;传递给连接程序的&nbsp;参数.<br />
通过对参数进行分析&nbsp;获取&nbsp;当前所编译的VB工程文件的完整路径.(如:F:\&nbsp;LinkWithVC\&nbsp;LinkWithVC.vbp),&nbsp;然后程序会查找该工程对应的自定义连接配置文件(F:\LinkWithVC\&nbsp;LinkWithVC_link.ini),&nbsp;如果找不到&nbsp;程序什么也不做直接调用vblink.exe.<br />
如果找到了,就读取里面的设置,按照设置进行相应的处理,最后调用&nbsp;vblink.exe.<br />
InI文件的配置将在&nbsp;下面实践测试中做介绍．<br />
实践测试:<br />
运行VB6新建一个工程,工程名设为LinkWithVC,&nbsp;给工程添加一个模块(bas),&nbsp;名称设为&nbsp;ModVC.<br />
给窗体添加一个按钮&nbsp;名称&nbsp;cmdTest,&nbsp;标题&nbsp;Test.&nbsp;在ModVC中添加<br />
Public&nbsp;Function&nbsp;Test()&nbsp;As&nbsp;Long<br />
Test&nbsp;=&nbsp;9<br />
End&nbsp;Function<br />
在cmdTest的Click事件中添加&nbsp;代码&nbsp;msgbox&nbsp;test,&nbsp;保存工程,编译运行,点击按钮我们会看到<br />
<br />
是9没错就是&nbsp;9&nbsp;.<br />
现在我们启动VC6新建一个空的Win32工程名称就叫vcobj,目录就设置为VB工程LinkWithVC所在的目录.<br />
在工程中添加一个Generic&nbsp;Class&nbsp;,类的名称就叫ModVC,&nbsp;设置活动配置为&nbsp;Win32&nbsp;release.&nbsp;现在就点击&nbsp;Build&nbsp;菜单中的&nbsp;Compile&nbsp;ModVC.cpp&nbsp;将它编译成OBJ文件.<br />
然后在VB工程目录下建一个文件&nbsp;LinkWithVC_link.ini.在文件中输入如下内容:<br />
[Settings]<br />
lib=0<br />
log=1<br />
<br />
[OBJ]<br />
F:\LinkWithVC\vcobj\Release\ModVC.obj=F:\LinkWithVC\ModVC.obj<br />
<br />
[lib]<br />
注:F:\LinkWithVC是VB工程所在目录,F:\linkWithVC\vcobj是VC工程所在目录.<br />
Ini文件有三个段.Settings段有lib&nbsp;它表示&nbsp;需要附加的lib的数量.&nbsp;相应的lib在lib段中定义.<br />
OBJ段就是OBJ替换定义段可以是&nbsp;vc的obj=vb的obj.&nbsp;Fake&nbsp;Link程序会自动用vc的obj替换vb的obj文件.<br />
Log为1表示生成连接记录.&nbsp;有记录便于排错.<br />
好了现在我们切换到VB工程&nbsp;来生成LinkWithVC.exe<br />
完了我们会发现并没有生成EXE,&nbsp;打开log文件看看,会看到如下内容:<br />
Microsoft&nbsp;(R)&nbsp;Incremental&nbsp;Linker&nbsp;Version&nbsp;6.00.8447<br />
Copyright&nbsp;(C)&nbsp;Microsoft&nbsp;Corp&nbsp;1992-1998.&nbsp;All&nbsp;rights&nbsp;reserved.<br />
<br />
Form1.OBJ&nbsp;:&nbsp;error&nbsp;LNK2001:&nbsp;unresolved&nbsp;external&nbsp;symbol&nbsp;"private:&nbsp;void&nbsp;__stdcall&nbsp;ModVC::Test(void)"&nbsp;(?Test@ModVC@@AAGXXZ)<br />
F:\LinkWithVC\LinkWithVC.exe&nbsp;:&nbsp;fatal&nbsp;error&nbsp;LNK1120:&nbsp;1&nbsp;unresolved&nbsp;externals<br />
看到拉,连接出错了&nbsp;unresolved&nbsp;external&nbsp;symbol&nbsp;private:&nbsp;void&nbsp;__stdcall&nbsp;ModVC::Test(void)&nbsp;,这个是正常的,我们替换了ModVC.obj,而我们的VC的modvc.obj并没有定义这个函数.接下来就是解决这个问题了.知道怎么做了吧,…现在切换到VC,在类ModVC中定义一个private的函数void&nbsp;__stdcall&nbsp;Test();函数体先空着.再编译它.&nbsp;然后切换到VB生成EXE.好了生成了EXE文件了,我们运行它,点击按钮,会看到:<br />
<br />
是10不是9,显然替换成功了,可是为什么是10呢…我也不清楚….(:P)<br />
Void的函数怎么返回值呢?&nbsp;在Windows中&nbsp;函数返回值一般都是存放在eax中的,&nbsp;我们来试试.在&nbsp;Test的函数体中&nbsp;添加代码&nbsp;_asm&nbsp;mov&nbsp;eax&nbsp;,&nbsp;123,&nbsp;再重复前面的操作生成EXE,运行:<br />
<br />
看到了123是不是很兴奋啊.&nbsp;不要高兴得太早,返回值解决了,可是怎么给函数传递参数呢?<br />
<br />
<img src="/images/download.gif" align="absmiddle" /><a target="_blank" href="/attachments/month_0504/kh0n_LinkWithVC.rar">点击下载此文件</a>]]></content:encoded>
<link>https://www.rickw.cn/blogview/65</link>
<dc:subject>VB相关</dc:subject>
<dc:creator>rick</dc:creator>
<dc:date>2005-04-07 12:44:57</dc:date>
</item>
		
<item rdf:about="https://www.rickw.cn/blogview/64">
<title><![CDATA[用VB写MOUSE穿透的窗体]]></title>
	
<description><![CDATA[MOUSE穿透，就是写一个半透明的窗体，点击窗体的时候它下面的程序产生事件。&amp;nbsp;&amp;nbsp;&lt;br&gt;&amp;nbsp;&amp;nbsp;&lt;br&gt;---------------------------------------------------------------&amp;nbsp;&amp;nbsp;&lt;br&gt;[code]&amp;nbsp;&lt;br&gt;Const&amp;nbsp;&amp;nbsp;LWA_COLORKEY&amp;nbsp;&amp;nbsp;=&amp;nbsp;&amp;nbsp;&amp;amp;H1&amp;nbsp;&amp;nbsp;]]></description>
<content:encoded><![CDATA[MOUSE穿透，就是写一个半透明的窗体，点击窗体的时候它下面的程序产生事件。&nbsp;&nbsp;<br />
&nbsp;&nbsp;<br />
---------------------------------------------------------------&nbsp;&nbsp;<br />
<script type="text/javascript">window.attachEvent("onload",function (){AutoSizeDIV('CODE_Xtu3eG4VIJir')})</script><table width="98%" border="0" align="center" cellpadding="0" cellspacing="0" class="code_head"><tr><td></td><td align="right"><a href="javascript:CopyText(document.all.CODE_Xtu3eG4VIJir);">[复制到剪贴板] </a></td></tr></table><div class="code_main" id="CODE_Xtu3eG4VIJir" style="overflow-y:auto;overflow-x:auto;width: 98%;min-height:40px;max-height:500px;"><code><span style="color: #000000"><br />
<span style="color: #0000BB">&nbsp;<br /></span><span style="color: #007700">Const&nbsp;&nbsp;</span><span style="color: #0000BB">LWA_COLORKEY&nbsp;&nbsp;</span><span style="color: #007700">=&nbsp;&nbsp;&amp;</span><span style="color: #0000BB">H1&nbsp;&nbsp;<br /></span><span style="color: #007700">Const&nbsp;&nbsp;</span><span style="color: #0000BB">LWA_ALPHA&nbsp;&nbsp;</span><span style="color: #007700">=&nbsp;&nbsp;&amp;</span><span style="color: #0000BB">H2&nbsp;&nbsp;<br /></span><span style="color: #007700">Const&nbsp;&nbsp;</span><span style="color: #0000BB">GWL_EXSTYLE&nbsp;&nbsp;</span><span style="color: #007700">=&nbsp;&nbsp;(-</span><span style="color: #0000BB">20</span><span style="color: #007700">)&nbsp;&nbsp;<br />Const&nbsp;&nbsp;</span><span style="color: #0000BB">WS_EX_LAYERED&nbsp;&nbsp;</span><span style="color: #007700">=&nbsp;&nbsp;&amp;</span><span style="color: #0000BB">H80000&nbsp;&nbsp;<br /></span><span style="color: #007700">Private&nbsp;&nbsp;Declare&nbsp;&nbsp;Function&nbsp;&nbsp;</span><span style="color: #0000BB">GetWindowLong&nbsp;&nbsp;Lib&nbsp;&nbsp;</span><span style="color: #DD0000">"user32"&nbsp;&nbsp;</span><span style="color: #0000BB">Alias&nbsp;&nbsp;</span><span style="color: #DD0000">"GetWindowLongA"&nbsp;&nbsp;</span><span style="color: #007700">(</span><span style="color: #0000BB">ByVal&nbsp;&nbsp;hWnd&nbsp;&nbsp;</span><span style="color: #007700">As&nbsp;&nbsp;</span><span style="color: #0000BB">Long</span><span style="color: #007700">,&nbsp;&nbsp;</span><span style="color: #0000BB">ByVal&nbsp;&nbsp;nIndex&nbsp;&nbsp;</span><span style="color: #007700">As&nbsp;&nbsp;</span><span style="color: #0000BB">Long</span><span style="color: #007700">)&nbsp;&nbsp;As&nbsp;&nbsp;</span><span style="color: #0000BB">Long&nbsp;&nbsp;<br /></span><span style="color: #007700">Private&nbsp;&nbsp;Declare&nbsp;&nbsp;Function&nbsp;&nbsp;</span><span style="color: #0000BB">SetWindowLong&nbsp;&nbsp;Lib&nbsp;&nbsp;</span><span style="color: #DD0000">"user32"&nbsp;&nbsp;</span><span style="color: #0000BB">Alias&nbsp;&nbsp;</span><span style="color: #DD0000">"SetWindowLongA"&nbsp;&nbsp;</span><span style="color: #007700">(</span><span style="color: #0000BB">ByVal&nbsp;&nbsp;hWnd&nbsp;&nbsp;</span><span style="color: #007700">As&nbsp;&nbsp;</span><span style="color: #0000BB">Long</span><span style="color: #007700">,&nbsp;&nbsp;</span><span style="color: #0000BB">ByVal&nbsp;&nbsp;nIndex&nbsp;&nbsp;</span><span style="color: #007700">As&nbsp;&nbsp;</span><span style="color: #0000BB">Long</span><span style="color: #007700">,&nbsp;&nbsp;</span><span style="color: #0000BB">ByVal&nbsp;&nbsp;dwNewLong&nbsp;&nbsp;</span><span style="color: #007700">As&nbsp;&nbsp;</span><span style="color: #0000BB">Long</span><span style="color: #007700">)&nbsp;&nbsp;As&nbsp;&nbsp;</span><span style="color: #0000BB">Long&nbsp;&nbsp;<br /></span><span style="color: #007700">Private&nbsp;&nbsp;Declare&nbsp;&nbsp;Function&nbsp;&nbsp;</span><span style="color: #0000BB">SetLayeredWindowAttributes&nbsp;&nbsp;Lib&nbsp;&nbsp;</span><span style="color: #DD0000">"user32"&nbsp;&nbsp;</span><span style="color: #007700">(</span><span style="color: #0000BB">ByVal&nbsp;&nbsp;hWnd&nbsp;&nbsp;</span><span style="color: #007700">As&nbsp;&nbsp;</span><span style="color: #0000BB">Long</span><span style="color: #007700">,&nbsp;&nbsp;</span><span style="color: #0000BB">ByVal&nbsp;&nbsp;crKey&nbsp;&nbsp;</span><span style="color: #007700">As&nbsp;&nbsp;</span><span style="color: #0000BB">Long</span><span style="color: #007700">,&nbsp;&nbsp;</span><span style="color: #0000BB">ByVal&nbsp;&nbsp;bAlpha&nbsp;&nbsp;</span><span style="color: #007700">As&nbsp;&nbsp;</span><span style="color: #0000BB">Byte</span><span style="color: #007700">,&nbsp;&nbsp;</span><span style="color: #0000BB">ByVal&nbsp;&nbsp;dwFlags&nbsp;&nbsp;</span><span style="color: #007700">As&nbsp;&nbsp;</span><span style="color: #0000BB">Long</span><span style="color: #007700">)&nbsp;&nbsp;As&nbsp;&nbsp;</span><span style="color: #0000BB">Long&nbsp;&nbsp;<br /></span><span style="color: #007700">Private&nbsp;&nbsp;</span><span style="color: #0000BB">Sub&nbsp;&nbsp;Form_Load</span><span style="color: #007700">()&nbsp;&nbsp;<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">Dim&nbsp;&nbsp;Ret&nbsp;&nbsp;</span><span style="color: #007700">As&nbsp;&nbsp;</span><span style="color: #0000BB">Long&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ret&nbsp;&nbsp;</span><span style="color: #007700">=&nbsp;&nbsp;</span><span style="color: #0000BB">GetWindowLong</span><span style="color: #007700">(</span><span style="color: #0000BB">Me</span><span style="color: #007700">.</span><span style="color: #0000BB">hWnd</span><span style="color: #007700">,&nbsp;&nbsp;</span><span style="color: #0000BB">GWL_EXSTYLE</span><span style="color: #007700">)&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">Ret&nbsp;&nbsp;</span><span style="color: #007700">=&nbsp;&nbsp;</span><span style="color: #0000BB">Ret&nbsp;&nbsp;</span><span style="color: #007700">Or&nbsp;&nbsp;</span><span style="color: #0000BB">WS_EX_LAYERED&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetWindowLong&nbsp;&nbsp;Me</span><span style="color: #007700">.</span><span style="color: #0000BB">hWnd</span><span style="color: #007700">,&nbsp;&nbsp;</span><span style="color: #0000BB">GWL_EXSTYLE</span><span style="color: #007700">,&nbsp;&nbsp;</span><span style="color: #0000BB">Ret&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #DD0000">'Set&nbsp;&nbsp;the&nbsp;&nbsp;opacity&nbsp;&nbsp;of&nbsp;&nbsp;the&nbsp;&nbsp;layered&nbsp;&nbsp;window&nbsp;&nbsp;to&nbsp;&nbsp;200&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetLayeredWindowAttributes&nbsp;&nbsp;Me.hWnd,&nbsp;&nbsp;0,&nbsp;&nbsp;200,&nbsp;&nbsp;LWA_ALPHA&nbsp;&nbsp;<br />End&nbsp;&nbsp;Sub&nbsp;&nbsp;<br />&nbsp;</span><br />
</span><br />
</code></div><br />
---------------------------------------------------------------&nbsp;&nbsp;<br />
&nbsp;<br />
再加上WS_EX_TRANSPARENT就能穿透鼠标了：&nbsp;&nbsp;<br />
<script type="text/javascript">window.attachEvent("onload",function (){AutoSizeDIV('CODE_k3yNt83zuKtM')})</script><table width="98%" border="0" align="center" cellpadding="0" cellspacing="0" class="code_head"><tr><td></td><td align="right"><a href="javascript:CopyText(document.all.CODE_k3yNt83zuKtM);">[复制到剪贴板] </a></td></tr></table><div class="code_main" id="CODE_k3yNt83zuKtM" style="overflow-y:auto;overflow-x:auto;width: 98%;min-height:40px;max-height:500px;"><code><span style="color: #000000"><br />
<span style="color: #0000BB">&nbsp;<br /></span><span style="color: #007700">Const&nbsp;&nbsp;</span><span style="color: #0000BB">LWA_COLORKEY&nbsp;&nbsp;</span><span style="color: #007700">=&nbsp;&nbsp;&amp;</span><span style="color: #0000BB">H1&nbsp;&nbsp;<br /></span><span style="color: #007700">Const&nbsp;&nbsp;</span><span style="color: #0000BB">LWA_ALPHA&nbsp;&nbsp;</span><span style="color: #007700">=&nbsp;&nbsp;&amp;</span><span style="color: #0000BB">H2&nbsp;&nbsp;<br /></span><span style="color: #007700">Const&nbsp;&nbsp;</span><span style="color: #0000BB">GWL_EXSTYLE&nbsp;&nbsp;</span><span style="color: #007700">=&nbsp;&nbsp;(-</span><span style="color: #0000BB">20</span><span style="color: #007700">)&nbsp;&nbsp;<br />Const&nbsp;&nbsp;</span><span style="color: #0000BB">WS_EX_LAYERED&nbsp;&nbsp;</span><span style="color: #007700">=&nbsp;&nbsp;&amp;</span><span style="color: #0000BB">H80000&nbsp;&nbsp;<br /></span><span style="color: #007700">Const&nbsp;&nbsp;</span><span style="color: #0000BB">WS_EX_TRANSPARENT&nbsp;&nbsp;</span><span style="color: #007700">As&nbsp;&nbsp;</span><span style="color: #0000BB">Long&nbsp;&nbsp;</span><span style="color: #007700">=&nbsp;&nbsp;&amp;</span><span style="color: #0000BB">H20</span><span style="color: #007700">&amp;&nbsp;&nbsp;<br />Private&nbsp;&nbsp;Declare&nbsp;&nbsp;Function&nbsp;&nbsp;</span><span style="color: #0000BB">GetWindowLong&nbsp;&nbsp;Lib&nbsp;&nbsp;</span><span style="color: #DD0000">"user32"&nbsp;&nbsp;</span><span style="color: #0000BB">Alias&nbsp;&nbsp;</span><span style="color: #DD0000">"GetWindowLongA"&nbsp;&nbsp;</span><span style="color: #007700">(</span><span style="color: #0000BB">ByVal&nbsp;&nbsp;hWnd&nbsp;&nbsp;</span><span style="color: #007700">As&nbsp;&nbsp;</span><span style="color: #0000BB">Long</span><span style="color: #007700">,&nbsp;&nbsp;</span><span style="color: #0000BB">ByVal&nbsp;&nbsp;nIndex&nbsp;&nbsp;</span><span style="color: #007700">As&nbsp;&nbsp;</span><span style="color: #0000BB">Long</span><span style="color: #007700">)&nbsp;&nbsp;As&nbsp;&nbsp;</span><span style="color: #0000BB">Long&nbsp;&nbsp;<br /></span><span style="color: #007700">Private&nbsp;&nbsp;Declare&nbsp;&nbsp;Function&nbsp;&nbsp;</span><span style="color: #0000BB">SetWindowLong&nbsp;&nbsp;Lib&nbsp;&nbsp;</span><span style="color: #DD0000">"user32"&nbsp;&nbsp;</span><span style="color: #0000BB">Alias&nbsp;&nbsp;</span><span style="color: #DD0000">"SetWindowLongA"&nbsp;&nbsp;</span><span style="color: #007700">(</span><span style="color: #0000BB">ByVal&nbsp;&nbsp;hWnd&nbsp;&nbsp;</span><span style="color: #007700">As&nbsp;&nbsp;</span><span style="color: #0000BB">Long</span><span style="color: #007700">,&nbsp;&nbsp;</span><span style="color: #0000BB">ByVal&nbsp;&nbsp;nIndex&nbsp;&nbsp;</span><span style="color: #007700">As&nbsp;&nbsp;</span><span style="color: #0000BB">Long</span><span style="color: #007700">,&nbsp;&nbsp;</span><span style="color: #0000BB">ByVal&nbsp;&nbsp;dwNewLong&nbsp;&nbsp;</span><span style="color: #007700">As&nbsp;&nbsp;</span><span style="color: #0000BB">Long</span><span style="color: #007700">)&nbsp;&nbsp;As&nbsp;&nbsp;</span><span style="color: #0000BB">Long&nbsp;&nbsp;<br /></span><span style="color: #007700">Private&nbsp;&nbsp;Declare&nbsp;&nbsp;Function&nbsp;&nbsp;</span><span style="color: #0000BB">SetLayeredWindowAttributes&nbsp;&nbsp;Lib&nbsp;&nbsp;</span><span style="color: #DD0000">"user32"&nbsp;&nbsp;</span><span style="color: #007700">(</span><span style="color: #0000BB">ByVal&nbsp;&nbsp;hWnd&nbsp;&nbsp;</span><span style="color: #007700">As&nbsp;&nbsp;</span><span style="color: #0000BB">Long</span><span style="color: #007700">,&nbsp;&nbsp;</span><span style="color: #0000BB">ByVal&nbsp;&nbsp;crKey&nbsp;&nbsp;</span><span style="color: #007700">As&nbsp;&nbsp;</span><span style="color: #0000BB">Long</span><span style="color: #007700">,&nbsp;&nbsp;</span><span style="color: #0000BB">ByVal&nbsp;&nbsp;bAlpha&nbsp;&nbsp;</span><span style="color: #007700">As&nbsp;&nbsp;</span><span style="color: #0000BB">Byte</span><span style="color: #007700">,&nbsp;&nbsp;</span><span style="color: #0000BB">ByVal&nbsp;&nbsp;dwFlags&nbsp;&nbsp;</span><span style="color: #007700">As&nbsp;&nbsp;</span><span style="color: #0000BB">Long</span><span style="color: #007700">)&nbsp;&nbsp;As&nbsp;&nbsp;</span><span style="color: #0000BB">Long&nbsp;&nbsp;<br /></span><span style="color: #007700">Private&nbsp;&nbsp;</span><span style="color: #0000BB">Sub&nbsp;&nbsp;Form_Load</span><span style="color: #007700">()&nbsp;&nbsp;<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">Dim&nbsp;&nbsp;Ret&nbsp;&nbsp;</span><span style="color: #007700">As&nbsp;&nbsp;</span><span style="color: #0000BB">Long&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ret&nbsp;&nbsp;</span><span style="color: #007700">=&nbsp;&nbsp;</span><span style="color: #0000BB">GetWindowLong</span><span style="color: #007700">(</span><span style="color: #0000BB">Me</span><span style="color: #007700">.</span><span style="color: #0000BB">hWnd</span><span style="color: #007700">,&nbsp;&nbsp;</span><span style="color: #0000BB">GWL_EXSTYLE</span><span style="color: #007700">)&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">Ret&nbsp;&nbsp;</span><span style="color: #007700">=&nbsp;&nbsp;</span><span style="color: #0000BB">Ret&nbsp;&nbsp;</span><span style="color: #007700">Or&nbsp;&nbsp;</span><span style="color: #0000BB">WS_EX_LAYERED&nbsp;&nbsp;</span><span style="color: #007700">Or&nbsp;&nbsp;</span><span style="color: #0000BB">WS_EX_TRANSPARENT&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetWindowLong&nbsp;&nbsp;Me</span><span style="color: #007700">.</span><span style="color: #0000BB">hWnd</span><span style="color: #007700">,&nbsp;&nbsp;</span><span style="color: #0000BB">GWL_EXSTYLE</span><span style="color: #007700">,&nbsp;&nbsp;</span><span style="color: #0000BB">Ret&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #DD0000">'Set&nbsp;&nbsp;the&nbsp;&nbsp;opacity&nbsp;&nbsp;of&nbsp;&nbsp;the&nbsp;&nbsp;layered&nbsp;&nbsp;window&nbsp;&nbsp;to&nbsp;&nbsp;200&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetLayeredWindowAttributes&nbsp;&nbsp;Me.hWnd,&nbsp;&nbsp;0,&nbsp;&nbsp;200,&nbsp;&nbsp;LWA_ALPHA&nbsp;&nbsp;<br />End&nbsp;&nbsp;Sub&nbsp;&nbsp;<br />&nbsp;</span><br />
</span><br />
</code></div>]]></content:encoded>
<link>https://www.rickw.cn/blogview/64</link>
<dc:subject>VB相关</dc:subject>
<dc:creator>rick</dc:creator>
<dc:date>2005-04-06 01:12:33</dc:date>
</item>
		
<item rdf:about="https://www.rickw.cn/blogview/15">
<title><![CDATA[让vb自动改变控件的大小]]></title>
	
<description><![CDATA[当窗体大小改变时，如何动态的改变控件的大小是许多VB程序员头痛<br />
的事。有的人设置窗体Resizable但却不改变控件的大小；有的人则根据<br />
控件的绝对位置与窗口大小相加减的办法来重新定位控件与改变大小，这<br />
种办法比较繁琐，且不可重用；当然也有人则限定窗口干脆不让改变。有<br />
没有一种简便易行的办法？答案是肯定的，下面给出一个一劳永逸的办法，...More...]]></description>
<content:encoded><![CDATA[当窗体大小改变时，如何动态的改变控件的大小是许多VB程序员头痛<br />
的事。有的人设置窗体Resizable但却不改变控件的大小；有的人则根据<br />
控件的绝对位置与窗口大小相加减的办法来重新定位控件与改变大小，这<br />
种办法比较繁琐，且不可重用；当然也有人则限定窗口干脆不让改变。有<br />
没有一种简便易行的办法？答案是肯定的，下面给出一个一劳永逸的办法，<br />
源程序如下:<br />
Option&nbsp;Explicit<br />
Private&nbsp;FormOldWidth&nbsp;As&nbsp;Long<br />
'保存窗体的原始宽度<br />
Private&nbsp;FormOldHeight&nbsp;As&nbsp;Long<br />
'保存窗体的原始高度<br />
'在调用ResizeForm前先调用本函数<br />
Public&nbsp;Sub&nbsp;ResizeInit(FormName&nbsp;As&nbsp;Form)<br />
Dim&nbsp;Obj&nbsp;As&nbsp;Control<br />
FormOldWidth&nbsp;=&nbsp;FormName.ScaleWidth<br />
FormOldHeight&nbsp;=&nbsp;FormName.ScaleHeight<br />
On&nbsp;Error&nbsp;Resume&nbsp;Next<br />
For&nbsp;Each&nbsp;Obj&nbsp;In&nbsp;FormName<br />
Obj.Tag&nbsp;=&nbsp;Obj.Left&nbsp;&amp;&nbsp;"&nbsp;"&nbsp;&amp;&nbsp;Obj.Top&nbsp;&amp;&nbsp;"&nbsp;"<br />
&amp;&nbsp;Obj.Width&nbsp;&amp;&nbsp;"&nbsp;"&nbsp;&amp;&nbsp;Obj.Height&nbsp;&amp;&nbsp;"&nbsp;"<br />
Next&nbsp;Obj<br />
On&nbsp;Error&nbsp;GoTo&nbsp;0<br />
End&nbsp;Sub<br />
'按比例改变表单内各元件的大小，<br />
在调用ReSizeForm前先调用ReSizeInit函数<br />
Public&nbsp;Sub&nbsp;ResizeForm(FormName&nbsp;As&nbsp;Form)<br />
Dim&nbsp;Pos(4)&nbsp;As&nbsp;Double<br />
Dim&nbsp;i&nbsp;As&nbsp;Long,&nbsp;TempPos&nbsp;As&nbsp;Long,&nbsp;StartPos&nbsp;As&nbsp;Long<br />
Dim&nbsp;Obj&nbsp;As&nbsp;Control<br />
Dim&nbsp;ScaleX&nbsp;As&nbsp;Double,&nbsp;ScaleY&nbsp;As&nbsp;Double<br />
ScaleX&nbsp;=&nbsp;FormName.ScaleWidth&nbsp;/&nbsp;FormOldWidth<br />
'保存窗体宽度缩放比例<br />
ScaleY&nbsp;=&nbsp;FormName.ScaleHeight&nbsp;/&nbsp;FormOldHeight<br />
'保存窗体高度缩放比例<br />
On&nbsp;Error&nbsp;Resume&nbsp;Next<br />
For&nbsp;Each&nbsp;Obj&nbsp;In&nbsp;FormName<br />
StartPos&nbsp;=&nbsp;1<br />
For&nbsp;i&nbsp;=&nbsp;0&nbsp;To&nbsp;4<br />
'读取控件的原始位置与大小<br />
TempPos&nbsp;=&nbsp;InStr(StartPos,<br />
Obj.Tag,&nbsp;"&nbsp;",&nbsp;vbTextCompare)<br />
If&nbsp;TempPos&nbsp;＞&nbsp;0&nbsp;Then<br />
Pos(i)&nbsp;=&nbsp;Mid(Obj.Tag,<br />
StartPos,&nbsp;TempPos&nbsp;-&nbsp;StartPos)<br />
StartPos&nbsp;=&nbsp;TempPos&nbsp;+&nbsp;1<br />
Else<br />
Pos(i)&nbsp;=&nbsp;0<br />
End&nbsp;If<br />
'根据控件的原始位置及窗体改变大小<br />
的比例对控件重新定位与改变大小<br />
Obj.Move&nbsp;Pos(0)&nbsp;*&nbsp;ScaleX,&nbsp;Pos(1)<br />
＊&nbsp;ScaleY,&nbsp;Pos(2)&nbsp;*&nbsp;ScaleX,&nbsp;Pos(3)&nbsp;*&nbsp;ScaleY<br />
Next&nbsp;i<br />
Next&nbsp;Obj<br />
On&nbsp;Error&nbsp;GoTo&nbsp;0<br />
End&nbsp;Sub<br />
Private&nbsp;Sub&nbsp;Form_Load()<br />
Call&nbsp;ResizeInit(Me)&nbsp;'在程序装入时必须加入<br />
End&nbsp;Sub<br />
Private&nbsp;Sub&nbsp;Form_Resize()<br />
Call&nbsp;ResizeForm(Me)&nbsp;'确保窗体改变时控件随之改变<br />
End&nbsp;Sub<br />
<br />
——本例中给出了二个函数:ResizeInit和ResizeForm,在调用ResizeForm<br />
之前必须先调用ResizeInit。你可以将本程序拷到窗体代码段里，然后在<br />
窗体里加入任意控件即可进行测试。]]></content:encoded>
<link>https://www.rickw.cn/blogview/15</link>
<dc:subject>VB相关</dc:subject>
<dc:creator>rick</dc:creator>
<dc:date>2004-08-06 21:37:12</dc:date>
</item>
		
<item rdf:about="https://www.rickw.cn/blogview/14">
<title><![CDATA[利用VB捕捉并保存屏幕图像]]></title>
	
<description><![CDATA[大家知道在VB下利用API函数Bitblt可以将屏幕或者窗口上的图像拷贝到VB中&nbsp;<br />
<br />
的PictureBox对象中，但是如果简单地利用PictureBox的SavePicture函数来保存&nbsp;<br />
<br />
图像，会发现什么也保存不了。这篇文章就是介绍如何捕获并利用Windows下的OLE&nbsp;...More...]]></description>
<content:encoded><![CDATA[大家知道在VB下利用API函数Bitblt可以将屏幕或者窗口上的图像拷贝到VB中&nbsp;<br />
<br />
的PictureBox对象中，但是如果简单地利用PictureBox的SavePicture函数来保存&nbsp;<br />
<br />
图像，会发现什么也保存不了。这篇文章就是介绍如何捕获并利用Windows下的OLE&nbsp;<br />
<br />
&nbsp;API函数保存图像。&nbsp;<br />
<br />
　　首先来看源程序，先建立一个新的工程文件，然后在Form1中加入5个&nbsp;<br />
<br />
CommandButton对象和一个PictureBox对象，然后在Form1中加入以下代码：&nbsp;<br />
<br />
　　Option&nbsp;Explicit&nbsp;<br />
<br />
　　Option&nbsp;Base&nbsp;0&nbsp;<br />
<br />
　　Private&nbsp;Type&nbsp;PALETTEENTRY&nbsp;<br />
<br />
　　peRed&nbsp;As&nbsp;Byte&nbsp;<br />
<br />
　　peGreen&nbsp;As&nbsp;Byte&nbsp;<br />
<br />
　　peBlue&nbsp;As&nbsp;Byte&nbsp;<br />
<br />
　　peFlags&nbsp;As&nbsp;Byte&nbsp;<br />
<br />
　　End&nbsp;Type&nbsp;<br />
<br />
　　Private&nbsp;Type&nbsp;LOGPALETTE&nbsp;<br />
<br />
　　palVersion&nbsp;As&nbsp;Integer&nbsp;<br />
<br />
　　palNumEntries&nbsp;As&nbsp;Integer&nbsp;<br />
<br />
　　palPalEntry(255)&nbsp;As&nbsp;PALETTEENTRY&nbsp;<br />
<br />
　　End&nbsp;Type&nbsp;<br />
<br />
　　Private&nbsp;Type&nbsp;GUID&nbsp;<br />
<br />
　　Data1&nbsp;As&nbsp;Long&nbsp;<br />
<br />
　　Data2&nbsp;As&nbsp;Integer&nbsp;<br />
<br />
　　Data3&nbsp;As&nbsp;Integer&nbsp;<br />
<br />
　　Data4(7)&nbsp;As&nbsp;Byte&nbsp;<br />
<br />
　　End&nbsp;Type&nbsp;<br />
<br />
　　Private&nbsp;Const&nbsp;RASTERCAPS&nbsp;As&nbsp;Long&nbsp;=&nbsp;38&nbsp;<br />
<br />
　　Private&nbsp;Const&nbsp;RC_PALETTE&nbsp;As&nbsp;Long&nbsp;=&nbsp;＆H100&nbsp;<br />
<br />
　　Private&nbsp;Const&nbsp;SIZEPALETTE&nbsp;As&nbsp;Long&nbsp;=&nbsp;104&nbsp;<br />
<br />
　　Private&nbsp;Type&nbsp;RECT&nbsp;<br />
<br />
　　Left&nbsp;As&nbsp;Long&nbsp;<br />
<br />
　　Top&nbsp;As&nbsp;Long&nbsp;<br />
<br />
　　Right&nbsp;As&nbsp;Long&nbsp;<br />
<br />
　　Bottom&nbsp;As&nbsp;Long&nbsp;<br />
<br />
　　End&nbsp;Type&nbsp;<br />
<br />
　　Private&nbsp;Declare&nbsp;Function&nbsp;createCompatibleDC&nbsp;Lib&nbsp;“GDI32"&nbsp;(ByVal&nbsp;<br />
<br />
hDC&nbsp;As&nbsp;Long)&nbsp;As&nbsp;Long&nbsp;<br />
<br />
　　Private&nbsp;Declare&nbsp;Function&nbsp;createCompatibleBitmap&nbsp;Lib&nbsp;“GDI32"&nbsp;<br />
<br />
(ByVal&nbsp;hDC&nbsp;As&nbsp;Long,&nbsp;_&nbsp;<br />
<br />
　　ByVal&nbsp;nWidth&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;nHeight&nbsp;As&nbsp;Long)&nbsp;As&nbsp;Long&nbsp;<br />
<br />
　　Private&nbsp;Declare&nbsp;Function&nbsp;GetDeviceCaps&nbsp;Lib&nbsp;“GDI32"&nbsp;(ByVal&nbsp;hDC&nbsp;As&nbsp;<br />
<br />
Long,&nbsp;ByVal&nbsp;_iCapabilitiy&nbsp;As&nbsp;Long)&nbsp;As&nbsp;Long&nbsp;<br />
<br />
　　Private&nbsp;Declare&nbsp;Function&nbsp;GetSystemPaletteEntries&nbsp;Lib“GDI32"&nbsp;<br />
<br />
(ByVal&nbsp;hDC&nbsp;As&nbsp;Long,&nbsp;_ByVal&nbsp;wStartIndex&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;wNumEntries&nbsp;As&nbsp;<br />
<br />
Long,&nbsp;lpPaletteEntries&nbsp;_&nbsp;<br />
<br />
　　As&nbsp;PALETTEENTRY)&nbsp;As&nbsp;Long&nbsp;<br />
<br />
　　Private&nbsp;Declare&nbsp;Function&nbsp;createPalette&nbsp;Lib&nbsp;“GDI32"&nbsp;(lpLogPalette&nbsp;As&nbsp;<br />
<br />
&nbsp;LOGPALETTE)&nbsp;_&nbsp;<br />
<br />
&nbsp;&nbsp;<br />
<br />
　　As&nbsp;Long&nbsp;<br />
<br />
　　Private&nbsp;Declare&nbsp;Function&nbsp;selectObject&nbsp;Lib&nbsp;“GDI32"&nbsp;(ByVal&nbsp;hDC&nbsp;As&nbsp;<br />
<br />
Long,&nbsp;ByVal&nbsp;hObject&nbsp;_&nbsp;<br />
<br />
　　As&nbsp;Long)&nbsp;As&nbsp;Long&nbsp;<br />
<br />
　　Private&nbsp;Declare&nbsp;Function&nbsp;BitBlt&nbsp;Lib&nbsp;“GDI32"&nbsp;(ByVal&nbsp;hDCDest&nbsp;As&nbsp;Long,&nbsp;<br />
<br />
&nbsp;ByVal&nbsp;XDest&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;YDest&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;nWidth&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;<br />
<br />
nHeight&nbsp;As&nbsp;Long,&nbsp;_&nbsp;<br />
<br />
　　ByVal&nbsp;hDCSrc&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;XSrc&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;YSrc&nbsp;As&nbsp;Long,&nbsp;<br />
<br />
ByVal&nbsp;dwRop&nbsp;_&nbsp;<br />
<br />
　　（As&nbsp;Long)&nbsp;As&nbsp;Long&nbsp;<br />
<br />
　　Private&nbsp;Declare&nbsp;Function&nbsp;deleteDC&nbsp;Lib&nbsp;“GDI32"&nbsp;(ByVal&nbsp;hDC&nbsp;As&nbsp;Long)&nbsp;<br />
<br />
As&nbsp;Long&nbsp;<br />
<br />
　　Private&nbsp;Declare&nbsp;Function&nbsp;GetForegroundWindow&nbsp;Lib&nbsp;“USER32"&nbsp;()&nbsp;As&nbsp;<br />
<br />
Long&nbsp;<br />
<br />
　　Private&nbsp;Declare&nbsp;Function&nbsp;selectPalette&nbsp;Lib&nbsp;"GDI32"&nbsp;(ByVal&nbsp;hDC&nbsp;As&nbsp;<br />
<br />
Long,&nbsp;ByVal&nbsp;hPalette&nbsp;_&nbsp;<br />
<br />
　　As&nbsp;Long,&nbsp;ByVal&nbsp;bForceBackground&nbsp;As&nbsp;Long)&nbsp;As&nbsp;Long&nbsp;<br />
<br />
　　Private&nbsp;Declare&nbsp;Function&nbsp;RealizePalette&nbsp;Lib&nbsp;“GDI32"&nbsp;(ByVal&nbsp;hDC&nbsp;As&nbsp;<br />
<br />
Long)&nbsp;As&nbsp;Long&nbsp;<br />
<br />
　　Private&nbsp;Declare&nbsp;Function&nbsp;GetWindowDC&nbsp;Lib&nbsp;“USER32"&nbsp;(ByVal&nbsp;hWnd&nbsp;As&nbsp;<br />
<br />
Long)&nbsp;As&nbsp;Long&nbsp;<br />
<br />
　　Private&nbsp;Declare&nbsp;Function&nbsp;GetDC&nbsp;Lib&nbsp;“USER32"&nbsp;(ByVal&nbsp;hWnd&nbsp;As&nbsp;Long)&nbsp;As&nbsp;<br />
<br />
&nbsp;Long&nbsp;<br />
<br />
　　Private&nbsp;Declare&nbsp;Function&nbsp;GetWindowRect&nbsp;Lib&nbsp;“USER32"&nbsp;(ByVal&nbsp;hWnd&nbsp;<br />
<br />
As&nbsp;Long,&nbsp;lpRect&nbsp;As&nbsp;_&nbsp;<br />
<br />
　　RECT)&nbsp;As&nbsp;Long&nbsp;<br />
<br />
　　Private&nbsp;Declare&nbsp;Function&nbsp;ReleaseDC&nbsp;Lib&nbsp;“USER32"&nbsp;(ByVal&nbsp;hWnd&nbsp;As&nbsp;<br />
<br />
Long,&nbsp;ByVal&nbsp;hDC&nbsp;As&nbsp;_&nbsp;<br />
<br />
　　Long)&nbsp;As&nbsp;Long&nbsp;<br />
<br />
　　Private&nbsp;Declare&nbsp;Function&nbsp;GetDesktopWindow&nbsp;Lib&nbsp;“USER32"&nbsp;()&nbsp;As&nbsp;Long&nbsp;<br />
<br />
　　Private&nbsp;Type&nbsp;PicBmp&nbsp;<br />
<br />
　　Size&nbsp;As&nbsp;Long&nbsp;<br />
<br />
　　Type&nbsp;As&nbsp;Long&nbsp;<br />
<br />
　　hBmp&nbsp;As&nbsp;Long&nbsp;<br />
<br />
　　hPal&nbsp;As&nbsp;Long&nbsp;<br />
<br />
　　Reserved&nbsp;As&nbsp;Long&nbsp;<br />
<br />
　　End&nbsp;Type&nbsp;<br />
<br />
　　Private&nbsp;Declare&nbsp;Function&nbsp;OlecreatePictureIndirect&nbsp;Lib“olepro32.dll"&nbsp;<br />
<br />
&nbsp;(PicDesc&nbsp;As&nbsp;_&nbsp;<br />
<br />
　　PicBmp,&nbsp;RefIID&nbsp;As&nbsp;GUID,&nbsp;ByVal&nbsp;fPictureOwnsHandle&nbsp;As&nbsp;Long,&nbsp;IPic&nbsp;As&nbsp;<br />
<br />
IPicture)&nbsp;As&nbsp;Long&nbsp;<br />
<br />
　　'捕捉整个屏幕&nbsp;<br />
<br />
　　Private&nbsp;Sub&nbsp;Command1_Click()&nbsp;<br />
<br />
　　Set&nbsp;Picture1.Picture&nbsp;=&nbsp;CaptureScreen()&nbsp;<br />
<br />
　　End&nbsp;Sub&nbsp;<br />
<br />
　　'在两秒钟后捕捉当前的活动窗口&nbsp;<br />
<br />
　　Private&nbsp;Sub&nbsp;Command2_Click()&nbsp;<br />
<br />
　　MsgBox“当你关闭这个对话框两秒钟之后程序会捕捉处于活动状态的窗口。&nbsp;<br />
<br />
"&nbsp;<br />
<br />
　　'等待两秒钟&nbsp;<br />
<br />
　　Dim&nbsp;EndTime&nbsp;As&nbsp;Date&nbsp;<br />
<br />
　　EndTime&nbsp;=&nbsp;DateAdd(“s",&nbsp;2,&nbsp;Now)&nbsp;<br />
<br />
　　Do&nbsp;Until&nbsp;Now&nbsp;&gt;&nbsp;EndTime&nbsp;<br />
<br />
　　DoEvents&nbsp;<br />
<br />
　　Loop&nbsp;<br />
<br />
　　Set&nbsp;Picture1.Picture&nbsp;=&nbsp;CaptureActiveWindow()&nbsp;<br />
<br />
　　Me.SetFocus&nbsp;<br />
<br />
　　End&nbsp;Sub&nbsp;<br />
<br />
　　Private&nbsp;Sub&nbsp;Command3_Click()&nbsp;<br />
<br />
　　Set&nbsp;Picture1.Picture&nbsp;=&nbsp;Nothing&nbsp;<br />
<br />
　　End&nbsp;Sub&nbsp;<br />
<br />
　　Public&nbsp;Function&nbsp;createBitmapPicture(ByVal&nbsp;hBmp&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;hPal&nbsp;<br />
<br />
As&nbsp;Long)&nbsp;As&nbsp;Picture&nbsp;<br />
<br />
　　Dim&nbsp;r&nbsp;As&nbsp;Long&nbsp;<br />
<br />
　　Dim&nbsp;Pic&nbsp;As&nbsp;PicBmp&nbsp;<br />
<br />
　　Dim&nbsp;IPic&nbsp;As&nbsp;IPicture&nbsp;<br />
<br />
　　Dim&nbsp;IID_IDispatch&nbsp;As&nbsp;GUID&nbsp;<br />
<br />
　　'填充IDispatch界面&nbsp;<br />
<br />
　　With&nbsp;IID_IDispatch&nbsp;<br />
<br />
　　.Data1&nbsp;=&nbsp;＆H20400&nbsp;<br />
<br />
　　.Data4(0)&nbsp;=&nbsp;＆HC0&nbsp;<br />
<br />
　　.Data4(7)&nbsp;=&nbsp;＆H46&nbsp;<br />
<br />
　　End&nbsp;With&nbsp;<br />
<br />
　　'填充Pic&nbsp;<br />
<br />
　　With&nbsp;Pic&nbsp;<br />
<br />
　　.Size&nbsp;=&nbsp;Len(Pic)&nbsp;<br />
<br />
　　'&nbsp;Pic结构长度&nbsp;<br />
<br />
　　.Type&nbsp;=&nbsp;vbPicTypeBitmap&nbsp;<br />
<br />
　　'&nbsp;图像类型&nbsp;<br />
<br />
　　.hBmp&nbsp;=&nbsp;hBmp&nbsp;<br />
<br />
　　'&nbsp;位图句柄&nbsp;<br />
<br />
　　.hPal&nbsp;=&nbsp;hPal&nbsp;<br />
<br />
　　'&nbsp;调色板句柄&nbsp;<br />
<br />
　　End&nbsp;With&nbsp;<br />
<br />
　　'建立Picture图像&nbsp;<br />
<br />
　　r&nbsp;=&nbsp;OlecreatePictureIndirect(Pic,&nbsp;IID_IDispatch,&nbsp;1,&nbsp;IPic)&nbsp;<br />
<br />
　　'返回Picture对象&nbsp;<br />
<br />
　　Set&nbsp;createBitmapPicture&nbsp;=&nbsp;IPic&nbsp;<br />
<br />
　　End&nbsp;Function&nbsp;<br />
<br />
　　Public&nbsp;Function&nbsp;CaptureWindow(ByVal&nbsp;hWndSrc&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;Client&nbsp;As&nbsp;<br />
<br />
&nbsp;Boolean,&nbsp;ByVal&nbsp;_&nbsp;<br />
<br />
　　LeftSrc&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;TopSrc&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;WidthSrc&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;<br />
<br />
&nbsp;HeightSrc&nbsp;_&nbsp;<br />
<br />
　　As&nbsp;Long)&nbsp;As&nbsp;Picture&nbsp;<br />
<br />
　　Dim&nbsp;hDCMemory&nbsp;As&nbsp;Long&nbsp;<br />
<br />
　　Dim&nbsp;hBmp&nbsp;As&nbsp;Long&nbsp;<br />
<br />
　　Dim&nbsp;hBmpPrev&nbsp;As&nbsp;Long&nbsp;<br />
<br />
　　Dim&nbsp;r&nbsp;As&nbsp;Long&nbsp;<br />
<br />
　　Dim&nbsp;hDCSrc&nbsp;As&nbsp;Long&nbsp;<br />
<br />
　　Dim&nbsp;hPal&nbsp;As&nbsp;Long&nbsp;<br />
<br />
　　Dim&nbsp;hPalPrev&nbsp;As&nbsp;Long&nbsp;<br />
<br />
　　Dim&nbsp;RasterCapsScrn&nbsp;As&nbsp;Long&nbsp;<br />
<br />
　　Dim&nbsp;HasPaletteScrn&nbsp;As&nbsp;Long&nbsp;<br />
<br />
　　Dim&nbsp;PaletteSizeScrn&nbsp;As&nbsp;Long&nbsp;<br />
<br />
　　Dim&nbsp;LogPal&nbsp;As&nbsp;LOGPALETTE&nbsp;<br />
<br />
　　If&nbsp;Client&nbsp;Then&nbsp;<br />
<br />
　　hDCSrc&nbsp;=&nbsp;GetDC(hWndSrc)&nbsp;<br />
<br />
　　Else&nbsp;<br />
<br />
　　hDCSrc&nbsp;=&nbsp;GetWindowDC(hWndSrc)&nbsp;<br />
<br />
　　End&nbsp;If&nbsp;<br />
<br />
　　hDCMemory&nbsp;=&nbsp;createCompatibleDC(hDCSrc)&nbsp;<br />
<br />
　　hBmp&nbsp;=&nbsp;createCompatibleBitmap(hDCSrc,&nbsp;WidthSrc,&nbsp;HeightSrc)&nbsp;<br />
<br />
　　hBmpPrev&nbsp;=&nbsp;selectObject(hDCMemory,&nbsp;hBmp)&nbsp;<br />
<br />
　　'获得屏幕属性&nbsp;<br />
<br />
　　RasterCapsScrn&nbsp;=&nbsp;GetDeviceCaps(hDCSrc,&nbsp;RASTERCAPS)&nbsp;<br />
<br />
　　HasPaletteScrn&nbsp;=&nbsp;RasterCapsScrn&nbsp;And&nbsp;RC_PALETTE&nbsp;<br />
<br />
　　PaletteSizeScrn&nbsp;=&nbsp;GetDeviceCaps(hDCSrc,&nbsp;SIZEPALETTE)&nbsp;<br />
<br />
　　'如果屏幕对象有调色板则获得屏幕调色板&nbsp;<br />
<br />
　　If&nbsp;HasPaletteScrn&nbsp;And&nbsp;(PaletteSizeScrn&nbsp;=&nbsp;256)&nbsp;Then&nbsp;<br />
<br />
　　'建立屏幕调色板的拷贝&nbsp;<br />
<br />
　　LogPal.palVersion&nbsp;=&nbsp;＆H300&nbsp;<br />
<br />
　　LogPal.palNumEntries&nbsp;=&nbsp;256&nbsp;<br />
<br />
　　r&nbsp;=&nbsp;GetSystemPaletteEntries(hDCSrc,&nbsp;0,&nbsp;256,&nbsp;LogPal.palPalEntry(0))&nbsp;<br />
<br />
　　hPal&nbsp;=&nbsp;createPalette(LogPal)&nbsp;<br />
<br />
　　'将新建立的调色板选如建立的内存绘图句柄中&nbsp;<br />
<br />
　　hPalPrev&nbsp;=&nbsp;selectPalette(hDCMemory,&nbsp;hPal,&nbsp;0)&nbsp;<br />
<br />
　　r&nbsp;=&nbsp;RealizePalette(hDCMemory)&nbsp;<br />
<br />
　　End&nbsp;If&nbsp;<br />
<br />
　　'拷贝图像&nbsp;<br />
<br />
　　r&nbsp;=&nbsp;BitBlt(hDCMemory,&nbsp;0,&nbsp;0,&nbsp;WidthSrc,&nbsp;HeightSrc,&nbsp;hDCSrc,&nbsp;LeftSrc,&nbsp;<br />
<br />
TopSrc,&nbsp;vbSrcCopy)&nbsp;<br />
<br />
　　hBmp&nbsp;=&nbsp;selectObject(hDCMemory,&nbsp;hBmpPrev)&nbsp;<br />
<br />
　　If&nbsp;HasPaletteScrn&nbsp;And&nbsp;(PaletteSizeScrn&nbsp;=&nbsp;256)&nbsp;Then&nbsp;<br />
<br />
　　hPal&nbsp;=&nbsp;selectPalette(hDCMemory,&nbsp;hPalPrev,&nbsp;0)&nbsp;<br />
<br />
　　End&nbsp;If&nbsp;<br />
<br />
　　'释放资源&nbsp;<br />
<br />
　　r&nbsp;=&nbsp;deleteDC(hDCMemory)&nbsp;<br />
<br />
　　r&nbsp;=&nbsp;ReleaseDC(hWndSrc,&nbsp;hDCSrc)&nbsp;<br />
<br />
　　Set&nbsp;CaptureWindow&nbsp;=&nbsp;createBitmapPicture(hBmp,&nbsp;hPal)&nbsp;<br />
<br />
　　End&nbsp;Function&nbsp;<br />
<br />
　　'capturescreen函数捕捉整个屏幕图像&nbsp;<br />
<br />
　　Public&nbsp;Function&nbsp;CaptureScreen()&nbsp;As&nbsp;Picture&nbsp;<br />
<br />
　　Dim&nbsp;hWndScreen&nbsp;As&nbsp;Long&nbsp;<br />
<br />
　　'获得桌面的窗口句柄&nbsp;<br />
<br />
　　hWndScreen&nbsp;=&nbsp;GetDesktopWindow()&nbsp;<br />
<br />
　　Set&nbsp;CaptureScreen&nbsp;=&nbsp;CaptureWindow(hWndScreen,&nbsp;False,&nbsp;0,&nbsp;0,&nbsp;Screen.&nbsp;<br />
<br />
Width&nbsp;_&nbsp;\&nbsp;Screen.TwipsPerPixelX,&nbsp;Screen.Height&nbsp;\&nbsp;Screen.&nbsp;<br />
<br />
TwipsPerPixelY)&nbsp;<br />
<br />
　　End&nbsp;Function&nbsp;<br />
<br />
　　Public&nbsp;Function&nbsp;CaptureActiveWindow()&nbsp;As&nbsp;Picture&nbsp;<br />
<br />
　　Dim&nbsp;hWndActive&nbsp;As&nbsp;Long&nbsp;<br />
<br />
　　Dim&nbsp;r&nbsp;As&nbsp;Long&nbsp;<br />
<br />
　　Dim&nbsp;RectActive&nbsp;As&nbsp;RECT&nbsp;<br />
<br />
　　hWndActive&nbsp;=&nbsp;GetForegroundWindow()&nbsp;<br />
<br />
　　r&nbsp;=&nbsp;GetWindowRect(hWndActive,&nbsp;RectActive)&nbsp;<br />
<br />
　　Set&nbsp;CaptureActiveWindow&nbsp;=&nbsp;CaptureWindow(hWndActive,&nbsp;False,&nbsp;0,&nbsp;0,&nbsp;_&nbsp;<br />
<br />
　　RectActive.Right&nbsp;－&nbsp;RectActive.Left,&nbsp;RectActive.Bottom&nbsp;－&nbsp;<br />
<br />
RectActive.Top)&nbsp;<br />
<br />
　　End&nbsp;Function&nbsp;<br />
<br />
　　Public&nbsp;Sub&nbsp;PrintPictureToFitPage(Prn&nbsp;As&nbsp;Printer,&nbsp;Pic&nbsp;As&nbsp;Picture)&nbsp;<br />
<br />
　　Const&nbsp;vbHiMetric&nbsp;As&nbsp;Integer&nbsp;=&nbsp;8&nbsp;<br />
<br />
　　Dim&nbsp;PicRatio&nbsp;As&nbsp;Double&nbsp;<br />
<br />
　　Dim&nbsp;PrnWidth&nbsp;As&nbsp;Double&nbsp;<br />
<br />
　　Dim&nbsp;PrnHeight&nbsp;As&nbsp;Double&nbsp;<br />
<br />
　　Dim&nbsp;PrnRatio&nbsp;As&nbsp;Double&nbsp;<br />
<br />
　　Dim&nbsp;PrnPicWidth&nbsp;As&nbsp;Double&nbsp;<br />
<br />
　　Dim&nbsp;PrnPicHeight&nbsp;As&nbsp;Double&nbsp;<br />
<br />
　　If&nbsp;Pic.Height&nbsp;&gt;=&nbsp;Pic.Width&nbsp;Then&nbsp;<br />
<br />
　　Prn.Orientation&nbsp;=&nbsp;vbPRORPortrait&nbsp;<br />
<br />
　　Else&nbsp;<br />
<br />
　　Prn.Orientation&nbsp;=&nbsp;vbPRORLandscape&nbsp;<br />
<br />
　　End&nbsp;If&nbsp;<br />
<br />
　　PicRatio&nbsp;=&nbsp;Pic.Width&nbsp;/&nbsp;Pic.Height&nbsp;<br />
<br />
　　PrnWidth&nbsp;=&nbsp;Prn.ScaleX(Prn.ScaleWidth,&nbsp;Prn.ScaleMode,&nbsp;vbHiMetric)&nbsp;<br />
<br />
　　PrnHeight&nbsp;=&nbsp;Prn.ScaleY(Prn.ScaleHeight,&nbsp;Prn.ScaleMode,&nbsp;vbHiMetric)&nbsp;<br />
<br />
　　PrnRatio&nbsp;=&nbsp;PrnWidth&nbsp;/&nbsp;PrnHeight&nbsp;<br />
<br />
　　If&nbsp;PicRatio&nbsp;&gt;=&nbsp;PrnRatio&nbsp;Then&nbsp;<br />
<br />
　　PrnPicWidth&nbsp;=&nbsp;Prn.ScaleX(PrnWidth,&nbsp;vbHiMetric,&nbsp;Prn.ScaleMode)&nbsp;<br />
<br />
　　PrnPicHeight&nbsp;=&nbsp;Prn.ScaleY(PrnWidth&nbsp;/&nbsp;PicRatio,&nbsp;vbHiMetric,&nbsp;Prn.&nbsp;<br />
<br />
ScaleMode)&nbsp;<br />
<br />
　　Else&nbsp;<br />
<br />
　　PrnPicHeight&nbsp;=&nbsp;Prn.ScaleY(PrnHeight,&nbsp;vbHiMetric,&nbsp;Prn.ScaleMode)&nbsp;<br />
<br />
　　PrnPicWidth&nbsp;=&nbsp;Prn.ScaleX(PrnHeight&nbsp;＊&nbsp;PicRatio,&nbsp;vbHiMetric,&nbsp;Prn.&nbsp;<br />
<br />
ScaleMode)&nbsp;<br />
<br />
　　End&nbsp;If&nbsp;<br />
<br />
　　Prn.PaintPicture&nbsp;Pic,&nbsp;0,&nbsp;0,&nbsp;PrnPicWidth,&nbsp;PrnPicHeight&nbsp;<br />
<br />
　　End&nbsp;Sub&nbsp;<br />
<br />
　　Private&nbsp;Sub&nbsp;Command4_Click()&nbsp;<br />
<br />
　　CommonDialog1.DefaultExt&nbsp;=“.BMP"&nbsp;<br />
<br />
　　CommonDialog1.Filter&nbsp;=“Bitmap&nbsp;Image&nbsp;(＊.bmp)|＊.bmp"&nbsp;<br />
<br />
　　CommonDialog1.ShowSave&nbsp;<br />
<br />
　　If&nbsp;CommonDialog1.FileName&nbsp;&lt;&gt;&nbsp;“"&nbsp;Then&nbsp;<br />
<br />
　　SavePicture&nbsp;Picture1.Picture,&nbsp;CommonDialog1.FileName&nbsp;<br />
<br />
　　End&nbsp;If&nbsp;<br />
<br />
　　End&nbsp;Sub&nbsp;<br />
<br />
　　Private&nbsp;Sub&nbsp;Command5_Click()&nbsp;<br />
<br />
　　PrintPictureToFitPage&nbsp;Printer,&nbsp;Picture1.Picture&nbsp;<br />
<br />
　　Printer.EndDoc&nbsp;<br />
<br />
　　End&nbsp;Sub&nbsp;<br />
<br />
　　Private&nbsp;Sub&nbsp;Form_Load()&nbsp;<br />
<br />
　　Command1.Caption&nbsp;=&nbsp;“捕捉整个屏幕"&nbsp;<br />
<br />
　　Command2.Caption&nbsp;=&nbsp;“两秒钟后捕捉活动窗口"&nbsp;<br />
<br />
　　Command3.Caption&nbsp;=&nbsp;“清除图像"&nbsp;<br />
<br />
　　Command4.Caption&nbsp;=&nbsp;“保存图像"&nbsp;<br />
<br />
　　Command5.Caption&nbsp;=&nbsp;“打印图像"&nbsp;<br />
<br />
　　End&nbsp;Sub&nbsp;<br />
<br />
　　运行程序，点击command1或者Command2就可以捕捉整个屏幕或者窗口到&nbsp;<br />
<br />
Picture1中，然后点击Command4或者Command5就可以保存或打印图像。&nbsp;<br />
<br />
<br />
　　上面的程序中最重要的是CaptureWindow函数以及createBitmapPicture函数，&nbsp;<br />
<br />
CaptureWindow函数建立与要捕捉的窗口的绘图设备（Device&nbsp;Context）句柄相兼&nbsp;<br />
<br />
容的绘图设备（Device&nbsp;Context）句柄，然后建立相应的调色板，最后将绘图设备&nbsp;<br />
<br />
（Device&nbsp;Context）中的图像拷贝到一个hBitmap对象句柄中。&nbsp;<br />
<br />
createBitmapPicture函数则根据传递过来的hBitmap对象句柄和调色板句柄建立一&nbsp;<br />
<br />
个Picture对象。再将这个对象赋予PictureBox的Picture属性，然后就可以使用&nbsp;<br />
<br />
SavePicture函数来保存图像了。&nbsp;<br />
<br />
　　OlecreatePictureIndirect函数支持的不仅有BMP图像，同时也支持Ico图标，&nbsp;<br />
<br />
所以利用该函数和ExtractIcon函数也可以提取并保存Windows文件中的图标。]]></content:encoded>
<link>https://www.rickw.cn/blogview/14</link>
<dc:subject>VB相关</dc:subject>
<dc:creator>rick</dc:creator>
<dc:date>2004-08-06 21:33:35</dc:date>
</item>
		
<item rdf:about="https://www.rickw.cn/blogview/13">
<title><![CDATA[隐藏任务栏]]></title>
	
<description><![CDATA[下面的代码就可以轻松搞定。&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;Private&nbsp;Const&nbsp;SWP_HIDEWINDOW&nbsp;=&nbsp;&amp;H80&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
Private&nbsp;Const&nbsp;SWP_SHOWWINDOW&nbsp;=&nbsp;&amp;H40&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;Private&nbsp;Declare&nbsp;Function&nbsp;FindWindow&nbsp;Lib&nbsp;"user32"&nbsp;Alias&nbsp;"FindWindowA"&nbsp;(ByVal&nbsp;lpClassName&nbsp;As&nbsp;String,&nbsp;ByVal&nbsp;lpWindowName&nbsp;As&nbsp;String)&nbsp;As&nbsp;Long&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
Private&nbsp;Function&nbsp;SetWindowPos&nbsp;Lib&nbsp;"user32"&nbsp;Alias&nbsp;"SetWindowPos"&nbsp;(ByVal&nbsp;hwnd&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;hWndinsertAfter&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;x&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;y&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;cx&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;cy&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;wFlags&nbsp;As&nbsp;Long)&nbsp;As&nbsp;Long&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...More...]]></description>
<content:encoded><![CDATA[下面的代码就可以轻松搞定。&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;Private&nbsp;Const&nbsp;SWP_HIDEWINDOW&nbsp;=&nbsp;&amp;H80&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
Private&nbsp;Const&nbsp;SWP_SHOWWINDOW&nbsp;=&nbsp;&amp;H40&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;Private&nbsp;Declare&nbsp;Function&nbsp;FindWindow&nbsp;Lib&nbsp;"user32"&nbsp;Alias&nbsp;"FindWindowA"&nbsp;(ByVal&nbsp;lpClassName&nbsp;As&nbsp;String,&nbsp;ByVal&nbsp;lpWindowName&nbsp;As&nbsp;String)&nbsp;As&nbsp;Long&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
Private&nbsp;Function&nbsp;SetWindowPos&nbsp;Lib&nbsp;"user32"&nbsp;Alias&nbsp;"SetWindowPos"&nbsp;(ByVal&nbsp;hwnd&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;hWndinsertAfter&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;x&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;y&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;cx&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;cy&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;wFlags&nbsp;As&nbsp;Long)&nbsp;As&nbsp;Long&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
Private&nbsp;Function&nbsp;SetWindowPos&nbsp;Lib&nbsp;"user32"&nbsp;Alias&nbsp;"SetWindowPos"&nbsp;(ByVal&nbsp;hwnd&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
Public&nbsp;Sub&nbsp;ViewTaskBar(lbValue&nbsp;As&nbsp;Boolean)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
Dim&nbsp;llResult&nbsp;As&nbsp;Long&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
llResult&nbsp;=&nbsp;FindWindow("Shell_traywnd",&nbsp;"")&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
If&nbsp;llResult&nbsp;Then&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
If&nbsp;lbValue&nbsp;Then<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
llResult&nbsp;=&nbsp;SetWindowPos(llResult,&nbsp;0,&nbsp;0,&nbsp;0,&nbsp;0,&nbsp;0,&nbsp;SWP_SHOWWINDOW)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Else&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;llResult&nbsp;=&nbsp;SetWindowPos(llResult,&nbsp;0,&nbsp;0,&nbsp;0,&nbsp;0,&nbsp;0,&nbsp;SWP_HIDEWINDOW)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
End&nbsp;If&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;End&nbsp;If&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;End&nbsp;Sub&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;调用过程ViewTaskBar,lbValue为false时隐藏任务栏。]]></content:encoded>
<link>https://www.rickw.cn/blogview/13</link>
<dc:subject>VB相关</dc:subject>
<dc:creator>rick</dc:creator>
<dc:date>2004-08-06 21:31:46</dc:date>
</item>
		
<item rdf:about="https://www.rickw.cn/blogview/12">
<title><![CDATA[使本程序不出现在Windows的结束任务对话框中 (win9x)]]></title>
	
<description><![CDATA[想做到这一点,你必须将你的程序注册为一个Service,这将通过把你的应用程序的Pro&nbsp;<br />
<br />
cess&nbsp;ID传递给RegisterService&nbsp;API&nbsp;<br />
<br />
声明部分:&nbsp;...More...]]></description>
<content:encoded><![CDATA[想做到这一点,你必须将你的程序注册为一个Service,这将通过把你的应用程序的Pro&nbsp;<br />
<br />
cess&nbsp;ID传递给RegisterService&nbsp;API&nbsp;<br />
<br />
声明部分:&nbsp;<br />
<br />
将一下这些代码复制到模块的声明部分&nbsp;<br />
<br />
Public&nbsp;Declare&nbsp;Function&nbsp;GetCurrentProcessId&nbsp;_&nbsp;<br />
<br />
Lib&nbsp;"kernel32"&nbsp;()&nbsp;As&nbsp;Long&nbsp;<br />
<br />
Public&nbsp;Declare&nbsp;Function&nbsp;GetCurrentProcess&nbsp;_&nbsp;<br />
<br />
Lib&nbsp;"kernel32"&nbsp;()&nbsp;As&nbsp;Long&nbsp;<br />
<br />
Public&nbsp;Declare&nbsp;Function&nbsp;RegisterServiceProcess&nbsp;_&nbsp;<br />
<br />
Lib&nbsp;"kernel32"&nbsp;(ByVal&nbsp;dwProcessID&nbsp;As&nbsp;Long,&nbsp;_&nbsp;<br />
<br />
ByVal&nbsp;dwType&nbsp;As&nbsp;Long)&nbsp;As&nbsp;Long&nbsp;<br />
<br />
Public&nbsp;Const&nbsp;RSP_SIMPLE_SERVICE&nbsp;=&nbsp;1&nbsp;<br />
<br />
Public&nbsp;Const&nbsp;RSP_UNREGISTER_SERVICE&nbsp;=&nbsp;0&nbsp;<br />
<br />
过程:&nbsp;<br />
<br />
调用MakeMeService使你的程序不出现在结束任务对话框中&nbsp;<br />
<br />
Public&nbsp;Sub&nbsp;MakeMeService()&nbsp;<br />
<br />
Dim&nbsp;pid&nbsp;As&nbsp;Long&nbsp;<br />
<br />
Dim&nbsp;reserv&nbsp;As&nbsp;Long&nbsp;<br />
<br />
<br />
Dim&nbsp;reserv&nbsp;As&nbsp;Long&nbsp;<br />
<br />
pid&nbsp;=&nbsp;GetCurrentProcessId()&nbsp;<br />
<br />
regserv&nbsp;=&nbsp;RegisterServiceProcess(pid,&nbsp;RSP_SIMPLE_SERVICE)&nbsp;<br />
<br />
End&nbsp;Sub&nbsp;<br />
<br />
使你的程序重新出现在结束任务对话框中,调用UnMakeMeService&nbsp;<br />
<br />
Public&nbsp;UnMakeMeService()&nbsp;<br />
<br />
Dim&nbsp;pid&nbsp;As&nbsp;Long&nbsp;<br />
<br />
Dim&nbsp;reserv&nbsp;As&nbsp;Long&nbsp;<br />
<br />
pid&nbsp;=&nbsp;GetCurrentProcessId()&nbsp;<br />
<br />
regserv&nbsp;=&nbsp;RegisterServiceProcess(pid,&nbsp;_&nbsp;<br />
<br />
RSP_UNREGISTER_SERVICE)&nbsp;<br />
<br />
'End&nbsp;Code&nbsp;<br />
<br />
不要忘了在关闭你的程序时调用UnMakeService来注销其Service来释放系统资源]]></content:encoded>
<link>https://www.rickw.cn/blogview/12</link>
<dc:subject>VB相关</dc:subject>
<dc:creator>rick</dc:creator>
<dc:date>2004-08-06 21:30:46</dc:date>
</item>
		
<item rdf:about="https://www.rickw.cn/blogview/11">
<title><![CDATA[VB中创建可以输出函数的DLL]]></title>
	
<description><![CDATA[VB中创建的DLL只是COM组件，无法作为输出函数的DLL。今天从袁波哪里搞到一种可以创建<br />
输出函数的DLL的方法。<br />
VB编译文件实际上采取了两次编译的方法，首先是调用c2.exe产生OBJ文件，然后调用Lin<br />
k.exe连接。如果在link的时候添加EXPORT选项，实际上是可以输出函数的。但是，在VB的<br />
工程选项中将这些屏蔽了。而且过分的是：VB在Build完成后会将OBJ文件删除，这样就无...More...]]></description>
<content:encoded><![CDATA[VB中创建的DLL只是COM组件，无法作为输出函数的DLL。今天从袁波哪里搞到一种可以创建<br />
输出函数的DLL的方法。<br />
VB编译文件实际上采取了两次编译的方法，首先是调用c2.exe产生OBJ文件，然后调用Lin<br />
k.exe连接。如果在link的时候添加EXPORT选项，实际上是可以输出函数的。但是，在VB的<br />
工程选项中将这些屏蔽了。而且过分的是：VB在Build完成后会将OBJ文件删除，这样就无<br />
法通过Link来输出函数了。不过我找到一个比较龌鹾的变通的方法，就是先创建一个Exe工<br />
程，在Form_Load事件里面写下面的语句:<br />
<br />
<br />
Private&nbsp;Sub&nbsp;Form_Load()<br />
&nbsp;&nbsp;&nbsp;&nbsp;If&nbsp;(MsgBox("hehe",&nbsp;vbOKCancel)&nbsp;=&nbsp;vbOK)&nbsp;Then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Shell&nbsp;"link2.exe&nbsp;"&nbsp;&amp;&nbsp;Command$<br />
&nbsp;&nbsp;&nbsp;&nbsp;End&nbsp;If<br />
&nbsp;End<br />
End&nbsp;Sub<br />
<br />
然后编译为linktemp.exe，接下来将LINK.EXE改名为Link2.exe，将linktemp.exe改名为l<br />
ink.exe。这样在VB调用link.exe时会弹出对话框，处理就会中断。这时就可以有机会将O<br />
BJ文件拷贝出来了&nbsp;J<br />
<br />
<br />
然后我创建了一个ActiveX&nbsp;DLL工程，在这个工程里面添加一个Module并创建一个Public函<br />
数mathadd：<br />
<br />
Public&nbsp;Function&nbsp;mathadd(ByVal&nbsp;a&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;b&nbsp;As&nbsp;Long)&nbsp;As&nbsp;Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;mathadd&nbsp;=&nbsp;a&nbsp;+&nbsp;b<br />
End&nbsp;Function<br />
<br />
Builder这个工程，在Link的时候就会中断。然后把创建的Class1.obj、Module1.obj、Pr<br />
oject1.obj备份出来。<br />
<br />
<br />
然后就可以调用Link2.exe连接OBJ到DLL了，我的连接代码是：<br />
<br />
<br />
link2.exe&nbsp;"e:\vbdll\Class1.obj"&nbsp;"e:\vbdll\Module1.obj"&nbsp;"e:\vbdll\Project1.obj"<br />
&nbsp;"c:\Program&nbsp;Files\Microsoft&nbsp;Visual&nbsp;Studio\VB98\VBAEXE6.LIB"&nbsp;/ENTRY:__vbaS&nbsp;/EX<br />
PORT:mathadd&nbsp;/OUT:"e:\vbdll\ProjectOK.dll"&nbsp;/BASE:0x11000000&nbsp;/SUBSYSTEM:WINDOWS<br />
,4.0&nbsp;/VERS<br />
<br />
<br />
注意里面的/ENTRY和/EXPORT开关，/EXPORT开关声明了输出函数mathadd。这样就大功告成<br />
了&nbsp;:-D，可以被其他语言引入，例如在VB中，只需要：<br />
<br />
<br />
Private&nbsp;Declare&nbsp;Function&nbsp;mathadd&nbsp;Lib&nbsp;"e:\vbdll\ProjectOK.dll"&nbsp;(ByVal&nbsp;a&nbsp;As&nbsp;Long<br />
,&nbsp;ByVal&nbsp;b&nbsp;As&nbsp;Long)&nbsp;As&nbsp;Long<br />
<br />
<br />
就可以了。<br />
<br />
<br />
]]></content:encoded>
<link>https://www.rickw.cn/blogview/11</link>
<dc:subject>VB相关</dc:subject>
<dc:creator>rick</dc:creator>
<dc:date>2004-08-06 19:54:29</dc:date>
</item>
		
</rdf:Seq>
</items>
</channel>
</rdf:RDF>