可是问题是 写出来后的EXE 双击EXE可以运行 但是用其他的EXE调用就不能运行 // 有的EXE可以调用 有的EXE就不能调用 //可能是你的问题了.按你的描述,我能想到的原因是------------初始化路径(也就是快捷方式属性窗口里的那个"起始位置").拿CreateProcess这个API来举例.它的原型如下:BOOL CreateProcess( LPCTSTR lpApplicationName, // pointer to name of executable module LPTSTR lpCommandLine, // pointer to command line string LPSECURITY_ATTRIBUTES lpProcessAttributes, // process security attributes LPSECURITY_ATTRIBUTES lpThreadAttributes, // thread security attributes BOOL bInheritHandles, // handle inheritance flag DWORD dwCreationFlags, // creation flags LPVOID lpEnvironment, // pointer to new environment block LPCTSTR lpCurrentDirectory, // pointer to current directory name LPSTARTUPINFO lpStartupInfo, // pointer to STARTUPINFO LPPROCESS_INFORMATION lpProcessInformation // pointer to PROCESS_INFORMATION ); lpCurrentDirectory这个参数,就是指定了程序启动时的初始路径.如果你的程序里使用了相对路径,而这个相对路径却没有使用App.Path来指定的话,就会有这情况.为此我写了一个小小的测试程序,如下:'这个框里的代码所需要的条件: '新建一个EXE工程; '在默认的窗体上添加两个按钮,名称不变,为Command1与Command2; '然后把这里所有的代码复制到窗体的代码窗口里面去,并生成一个EXE备用.我是生成了名为"TestInitDir.exe"的文件. Option ExplicitPrivate Sub Command1_Click() '不使用定位 If Dir("1.txt") <> "" Then MsgBox "TRUE" '找到文件,就弹出TRUE Else MsgBox "FALSE" '没找到,就弹出FALSE End If End SubPrivate Sub Command2_Click() '使用自定位 If Dir(AddStrToStr(App.Path, "\") & "1.txt") <> "" Then MsgBox "TRUE" '找到文件,就弹出TRUE Else MsgBox "FALSE" '没找到,就弹出FALSE End If End SubPrivate Function AddStrToStr(ByVal Str1 As String, ByVal Str2 As String) As String '自动添加字符串到目标字符串结尾 If LCase(Right(Str1, Len(Str2))) = LCase(Str2) Then AddStrToStr = Str1 Else AddStrToStr = Str1 & Str2 End If End Function以上是一个工作程序,是模拟你的EXE用的.下面这个是模拟其它的EXE调用你的EXE的情况.'这个框里的代码所需要的条件: '新建一个EXE工程; '在默认的窗体上添加两个按钮,名称不变,为Command1与Command2; '然后把这里所有的代码复制到窗体的代码窗口里面去.可以不生成EXE而直接在IDE里调用. Option ExplicitConst INFINITE = &HFFFF Const STARTF_USESHOWWINDOW = &H1 Private Enum enSW SW_HIDE = 0 SW_NORMAL = 1 SW_MAXIMIZE = 3 SW_MINIMIZE = 6 End Enum Private Type PROCESS_INFORMATION hProcess As Long hThread As Long dwProcessId As Long dwThreadId As Long End Type Private Type STARTUPINFO cb As Long lpReserved As String lpDesktop As String lpTitle As String dwX As Long dwY As Long dwXSize As Long dwYSize As Long dwXCountChars As Long dwYCountChars As Long dwFillAttribute As Long dwFlags As Long wShowWindow As Integer cbReserved2 As Integer lpReserved2 As Byte hStdInput As Long hStdOutput As Long hStdError As Long End Type Private Type SECURITY_ATTRIBUTES nLength As Long lpSecurityDescriptor As Long bInheritHandle As Long End Type Private Enum enPriority_Class NORMAL_PRIORITY_CLASS = &H20 IDLE_PRIORITY_CLASS = &H40 HIGH_PRIORITY_CLASS = &H80 End Enum Private Declare Function CreateProcess Lib "kernel32" Alias "CreateProcessA" (ByVal lpApplicationName As String, ByVal lpCommandLine As String, lpProcessAttributes As SECURITY_ATTRIBUTES, lpThreadAttributes As SECURITY_ATTRIBUTES, ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, lpEnvironment As Any, ByVal lpCurrentDriectory As String, lpStartupInfo As STARTUPINFO, lpProcessInformation As PROCESS_INFORMATION) As Long Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As LongPrivate Function SuperShell(ByVal App As String, ByVal WorkDir As String, dwMilliseconds As Long, ByVal start_size As enSW, ByVal Priority_Class As enPriority_Class) As Boolean '增强的Shell Dim pclass As Long Dim sinfo As STARTUPINFO Dim pinfo As PROCESS_INFORMATION Dim sec1 As SECURITY_ATTRIBUTES Dim sec2 As SECURITY_ATTRIBUTES
sec1.nLength = Len(sec1) sec2.nLength = Len(sec2) With sinfo .cb = Len(sinfo) .dwFlags = STARTF_USESHOWWINDOW .wShowWindow = start_size End With pclass = Priority_Class
If CreateProcess(vbNullString, App, sec1, sec2, False, pclass, _ 0&, WorkDir, sinfo, pinfo) Then WaitForSingleObject pinfo.hProcess, dwMilliseconds SuperShell = True Else SuperShell = False End If End FunctionPrivate Sub Command1_Click() '模拟"指定了错误的初始目录"的情况 SuperShell "d:\temp\testinitdir.exe", vbNullString, -1, SW_NORMAL, NORMAL_PRIORITY_CLASS End SubPrivate Sub Command2_Click() '模拟"指定了正确的初始目录"的情况 SuperShell "d:\temp\testinitdir.exe", "d:\temp\", -1, SW_NORMAL, NORMAL_PRIORITY_CLASS End Sub以上工作完成后,按如下过程来测试:首先在第一个EXE也就是TestInitDir.exe所在的目录下放一个1.txt,这个文件是模拟你EXE所使用的一些文件;手工双击这个EXE,看看两个按钮点下去所得到的结果是不是都是TRUE?如果是,那就继续:现在关了那个EXE,使用第二个工程来启动它.当然,第二个工程的那几个路径你得改成你机器上TestInitDir.exe实际的路径~~好.使用第一个按钮来启动TestInitDir.exe时,出现什么了?你点点TestInitDir.exe的第一个按钮?再点点第二个按钮?关了这个TestInitDir.exe,返回~~~然后用第二个按钮来启动TestInitDir.exe再试下?明白了没?如果你的程序真的是这个原因造成的,那么解决就非常简单-------在需要使用一个相对的资源时,使用App.Path来进行自定位就OK了.本来没必要写这么多,但是本着"学习WHY而不是学习HOW"的想法,把原因也写了一下.....于是才啰嗦了这么大一堆:)希望这些能帮到你.当然也希望你的问题就是这个原因~~嘿嘿不然就是牛头不对马嘴啦.....
shell (path_get & "/" & filename) '就是这个样子一行,path_get是你得到的路径,filename是文件名,好久不用vb了,自己稍稍修剪一下了。添加到你需要的事件里面。
希望大家能多提出想法和宝贵意见 谢谢
以1024X768 分辨率的屏幕为例 第一步 运行EXE后由于资源文件无法运行 但是其他的文件可以执行 所以把桌面的分成N个坐标点 每个ICO 在一个坐标中
第二步: 复制这个EXE 在桌面 系统会自动把这个EXE放在桌面最后一个位置
第三步:由于之前已经划分出每个ICO的坐标 以桌面上的ICO最后一个位置的 坐标虚拟双击运行
不知道 大家怎么想的 谢谢
//
有的EXE可以调用 有的EXE就不能调用
//可能是你的问题了.按你的描述,我能想到的原因是------------初始化路径(也就是快捷方式属性窗口里的那个"起始位置").拿CreateProcess这个API来举例.它的原型如下:BOOL CreateProcess(
LPCTSTR lpApplicationName,
// pointer to name of executable module
LPTSTR lpCommandLine, // pointer to command line string
LPSECURITY_ATTRIBUTES lpProcessAttributes, // process security attributes
LPSECURITY_ATTRIBUTES lpThreadAttributes, // thread security attributes
BOOL bInheritHandles, // handle inheritance flag
DWORD dwCreationFlags, // creation flags
LPVOID lpEnvironment, // pointer to new environment block
LPCTSTR lpCurrentDirectory, // pointer to current directory name
LPSTARTUPINFO lpStartupInfo, // pointer to STARTUPINFO
LPPROCESS_INFORMATION lpProcessInformation // pointer to PROCESS_INFORMATION
);
lpCurrentDirectory这个参数,就是指定了程序启动时的初始路径.如果你的程序里使用了相对路径,而这个相对路径却没有使用App.Path来指定的话,就会有这情况.为此我写了一个小小的测试程序,如下:'这个框里的代码所需要的条件:
'新建一个EXE工程;
'在默认的窗体上添加两个按钮,名称不变,为Command1与Command2;
'然后把这里所有的代码复制到窗体的代码窗口里面去,并生成一个EXE备用.我是生成了名为"TestInitDir.exe"的文件.
Option ExplicitPrivate Sub Command1_Click()
'不使用定位
If Dir("1.txt") <> "" Then
MsgBox "TRUE" '找到文件,就弹出TRUE
Else
MsgBox "FALSE" '没找到,就弹出FALSE
End If
End SubPrivate Sub Command2_Click()
'使用自定位
If Dir(AddStrToStr(App.Path, "\") & "1.txt") <> "" Then
MsgBox "TRUE" '找到文件,就弹出TRUE
Else
MsgBox "FALSE" '没找到,就弹出FALSE
End If
End SubPrivate Function AddStrToStr(ByVal Str1 As String, ByVal Str2 As String) As String
'自动添加字符串到目标字符串结尾
If LCase(Right(Str1, Len(Str2))) = LCase(Str2) Then
AddStrToStr = Str1
Else
AddStrToStr = Str1 & Str2
End If
End Function以上是一个工作程序,是模拟你的EXE用的.下面这个是模拟其它的EXE调用你的EXE的情况.'这个框里的代码所需要的条件:
'新建一个EXE工程;
'在默认的窗体上添加两个按钮,名称不变,为Command1与Command2;
'然后把这里所有的代码复制到窗体的代码窗口里面去.可以不生成EXE而直接在IDE里调用.
Option ExplicitConst INFINITE = &HFFFF
Const STARTF_USESHOWWINDOW = &H1
Private Enum enSW
SW_HIDE = 0
SW_NORMAL = 1
SW_MAXIMIZE = 3
SW_MINIMIZE = 6
End Enum
Private Type PROCESS_INFORMATION
hProcess As Long
hThread As Long
dwProcessId As Long
dwThreadId As Long
End Type
Private Type STARTUPINFO
cb As Long
lpReserved As String
lpDesktop As String
lpTitle As String
dwX As Long
dwY As Long
dwXSize As Long
dwYSize As Long
dwXCountChars As Long
dwYCountChars As Long
dwFillAttribute As Long
dwFlags As Long
wShowWindow As Integer
cbReserved2 As Integer
lpReserved2 As Byte
hStdInput As Long
hStdOutput As Long
hStdError As Long
End Type
Private Type SECURITY_ATTRIBUTES
nLength As Long
lpSecurityDescriptor As Long
bInheritHandle As Long
End Type
Private Enum enPriority_Class
NORMAL_PRIORITY_CLASS = &H20
IDLE_PRIORITY_CLASS = &H40
HIGH_PRIORITY_CLASS = &H80
End Enum
Private Declare Function CreateProcess Lib "kernel32" Alias "CreateProcessA" (ByVal lpApplicationName As String, ByVal lpCommandLine As String, lpProcessAttributes As SECURITY_ATTRIBUTES, lpThreadAttributes As SECURITY_ATTRIBUTES, ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, lpEnvironment As Any, ByVal lpCurrentDriectory As String, lpStartupInfo As STARTUPINFO, lpProcessInformation As PROCESS_INFORMATION) As Long
Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As LongPrivate Function SuperShell(ByVal App As String, ByVal WorkDir As String, dwMilliseconds As Long, ByVal start_size As enSW, ByVal Priority_Class As enPriority_Class) As Boolean
'增强的Shell
Dim pclass As Long
Dim sinfo As STARTUPINFO
Dim pinfo As PROCESS_INFORMATION
Dim sec1 As SECURITY_ATTRIBUTES
Dim sec2 As SECURITY_ATTRIBUTES
sec1.nLength = Len(sec1)
sec2.nLength = Len(sec2)
With sinfo
.cb = Len(sinfo)
.dwFlags = STARTF_USESHOWWINDOW
.wShowWindow = start_size
End With
pclass = Priority_Class
If CreateProcess(vbNullString, App, sec1, sec2, False, pclass, _
0&, WorkDir, sinfo, pinfo) Then
WaitForSingleObject pinfo.hProcess, dwMilliseconds
SuperShell = True
Else
SuperShell = False
End If
End FunctionPrivate Sub Command1_Click()
'模拟"指定了错误的初始目录"的情况
SuperShell "d:\temp\testinitdir.exe", vbNullString, -1, SW_NORMAL, NORMAL_PRIORITY_CLASS
End SubPrivate Sub Command2_Click()
'模拟"指定了正确的初始目录"的情况
SuperShell "d:\temp\testinitdir.exe", "d:\temp\", -1, SW_NORMAL, NORMAL_PRIORITY_CLASS
End Sub以上工作完成后,按如下过程来测试:首先在第一个EXE也就是TestInitDir.exe所在的目录下放一个1.txt,这个文件是模拟你EXE所使用的一些文件;手工双击这个EXE,看看两个按钮点下去所得到的结果是不是都是TRUE?如果是,那就继续:现在关了那个EXE,使用第二个工程来启动它.当然,第二个工程的那几个路径你得改成你机器上TestInitDir.exe实际的路径~~好.使用第一个按钮来启动TestInitDir.exe时,出现什么了?你点点TestInitDir.exe的第一个按钮?再点点第二个按钮?关了这个TestInitDir.exe,返回~~~然后用第二个按钮来启动TestInitDir.exe再试下?明白了没?如果你的程序真的是这个原因造成的,那么解决就非常简单-------在需要使用一个相对的资源时,使用App.Path来进行自定位就OK了.本来没必要写这么多,但是本着"学习WHY而不是学习HOW"的想法,把原因也写了一下.....于是才啰嗦了这么大一堆:)希望这些能帮到你.当然也希望你的问题就是这个原因~~嘿嘿不然就是牛头不对马嘴啦.....