uo_reghelper.sru 23 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009
  1. $PBExportHeader$uo_reghelper.sru
  2. forward
  3. global type uo_reghelper from nonvisualobject
  4. end type
  5. type filetime from structure within uo_reghelper
  6. end type
  7. type systemtime from structure within uo_reghelper
  8. end type
  9. end forward
  10. type filetime from structure
  11. long dwlowdatetime
  12. long dwhighdatetime
  13. end type
  14. type systemtime from structure
  15. integer wyear
  16. integer wmonth
  17. integer wdayofweek
  18. integer wday
  19. integer whour
  20. integer wminute
  21. integer wsecond
  22. integer wmilliseconds
  23. end type
  24. shared variables
  25. boolean sv_option_iftryreg = true // 控制是否注册
  26. end variables
  27. global type uo_reghelper from nonvisualobject
  28. end type
  29. global uo_reghelper uo_reghelper
  30. type prototypes
  31. Function long GetFullPathName (String lpFileName ,Long nBufferLength,ref string lpBuffer,ref long lpFilePart) library "kernel32" ALIAS FOR "GetFullPathNameA;Ansi"
  32. Function long CreateDirectory (string lpNewDirectory ,ref SECURITY_ATTRIBUTES lpSecurityAttributes ) library "kernel32" Alias for "CreateDirectoryA;Ansi"
  33. Function long GetFileTime (Long hFile ,ref filetime lpCreationTime ,ref filetime lpLastAccessTime ,ref filetime lpLastWriteTime ) library "kernel32" Alias for "GetFileTime;Ansi"
  34. Function long lopen (string lpPathName , long iReadWrite ) library "kernel32" Alias for "_lopen;Ansi"
  35. Function long lclose (long hFile) library "kernel32" Alias for "_lclose"
  36. Function long FileTimeToSystemTime (ref FILETIME lpFileTime ,ref SYSTEMTIME lpSystemTime ) library "kernel32" Alias for "FileTimeToSystemTime;Ansi"
  37. Function long CopyFile (String lpExistingFileName , String lpNewFileName , long bFailIfExists ) library "kernel32" Alias for "CopyFileA;Ansi"
  38. Subroutine Sleep(ulong dwMilliseconds) LIBRARY "kernel32.dll"
  39. Function long GetWindowsDirectory (ref string lpBuffer,long nSize) Library "kernel32" Alias for "GetWindowsDirectoryA;Ansi"
  40. Function long GetSystemDirectory (ref string lpBuffer,long nSize) Library "kernel32" Alias for "GetSystemDirectoryA;Ansi"
  41. Function long SetFileAttributes (String lpFileName , long dwFileAttributes ) Library "kernel32" Alias for "SetFileAttributesA;Ansi"
  42. end prototypes
  43. type variables
  44. public boolean ins_win32 = false
  45. end variables
  46. forward prototypes
  47. private function integer f_filetoblob (string arg_filepathname, ref blob arg_blobdata, ref string arg_msg)
  48. private function integer f_blobtofile (string arg_filepathname, blob arg_blobdata, ref string arg_msg)
  49. private function string f_clsid (string arg_progid)
  50. private function string f_codebase (string arg_progid)
  51. private function integer f_ifexist (string arg_regkey)
  52. private subroutine f_test ()
  53. private subroutine f_test1 ()
  54. private function integer reg32dll (string arg_filepath, ref string arg_msg)
  55. private function integer regdll (string arg_filepath, ref string arg_msg)
  56. public function integer unregdll (string arg_filepath, ref string arg_msg)
  57. public function integer connecttonewobject (string arg_progid, string arg_filepath, ref oleobject arg_ole, ref string arg_msg)
  58. public function datetime pf_getfilecreatetime (string arg_filefullpathname)
  59. public function integer tryreg (string arg_progid, string arg_filepath, ref string arg_msg, boolean arg_if_delete)
  60. public function integer tryreg (string arg_progid, string arg_filepath, ref string arg_msg)
  61. private function integer unreg32dll (string arg_filepath, ref string arg_msg)
  62. public function string pf_getfullpathname (string arg_filename)
  63. public function boolean pf_isadmin ()
  64. public subroutine set_sv_option_iftryreg (boolean arg_value)
  65. end prototypes
  66. private function integer f_filetoblob (string arg_filepathname, ref blob arg_blobdata, ref string arg_msg);//读入数据
  67. long flen,loops,ls_i,bytes_read,new_pos,rslt=1,li_FileNum
  68. blob b_dtdata_p,tot_b
  69. flen = FileLength(arg_filepathname)
  70. li_FileNum = FileOpen(arg_filepathname, StreamMode!, Read!, LockRead!)
  71. if li_FileNum=-1 then
  72. rslt=0
  73. arg_msg='打开文件'+arg_filepathname+'操作失败!'
  74. fileclose(li_FileNum)
  75. goto ext
  76. end if
  77. IF flen > 32765 THEN
  78. IF Mod(flen, 32765) = 0 THEN
  79. loops = flen/32765
  80. ELSE
  81. loops = (flen/32765) + 1
  82. END IF
  83. ELSE
  84. loops = 1
  85. END IF
  86. new_pos = 1
  87. FOR ls_i = 1 to loops
  88. bytes_read = FileRead(li_FileNum, b_dtdata_p)
  89. if bytes_read=0 then
  90. rslt=0
  91. arg_msg='读取文件'+arg_filepathname+'操作失败!'
  92. fileclose(li_FileNum)
  93. goto ext
  94. end if
  95. tot_b = tot_b + b_dtdata_p
  96. NEXT
  97. fileclose(li_FileNum)
  98. arg_blobdata=tot_b
  99. ext:
  100. return rslt
  101. end function
  102. private function integer f_blobtofile (string arg_filepathname, blob arg_blobdata, ref string arg_msg);//blob转文件
  103. long rslt=1,fend,fend_t
  104. blob b_dtdata, b_dtdata_p
  105. long li_FileNum,ls_i,ls_jh
  106. string tmpfilepathname
  107. tmpfilepathname=arg_filepathname
  108. b_dtdata=arg_blobdata
  109. fend=len(b_dtdata)
  110. if fend<=32765 then
  111. fend_t=1
  112. else
  113. fend_t=fend/32765
  114. if mod(fend,32765)<>0 then
  115. fend_t=fend_t+1
  116. end if
  117. end if
  118. li_FileNum = FileOpen( tmpfilepathname,StreamMode!, Write!, LockWrite!)
  119. if li_FileNum<=0 then
  120. arg_msg="打开文件"+tmpfilepathname+"失败"
  121. rslt=0
  122. fileclose(li_FileNum)
  123. goto ext
  124. end if
  125. for ls_i = 1 to fend_t
  126. b_dtdata_p=blobmid(b_dtdata,1+(ls_i - 1 )*32765,32765)
  127. ls_jh=FileWrite(li_FileNum, b_dtdata_p)
  128. if ls_jh<=0 then
  129. arg_msg="写文件"+tmpfilepathname+"失败"
  130. rslt=0
  131. fileclose(li_FileNum)
  132. goto ext
  133. end if
  134. next
  135. fileclose(li_FileNum)
  136. ext:
  137. return rslt
  138. end function
  139. private function string f_clsid (string arg_progid);String ls_key
  140. ls_key = "HKEY_CLASSES_ROOT\" + arg_progid + "\CLSID"
  141. String ls_clsid
  142. IF RegistryGet(ls_key, "", RegString!, ls_clsid) <> 1 THEN
  143. SetNull(ls_clsid)
  144. END IF
  145. RETURN ls_clsid
  146. end function
  147. private function string f_codebase (string arg_progid);String ls_clsid
  148. ls_clsid = f_clsid(arg_progid)
  149. String ls_codebase
  150. IF IsNull(ls_clsid) THEN
  151. SetNull(ls_codebase)
  152. GOTO ext
  153. END IF
  154. String ls_key
  155. ls_key = "HKEY_CLASSES_ROOT\CLSID\" + ls_clsid + "\InprocServer32"
  156. String ls_name
  157. IF ins_win32 THEN
  158. ls_name = ""
  159. ELSE
  160. ls_name = "CodeBase"
  161. END IF
  162. IF RegistryGet(ls_key, ls_name, RegString!, ls_codebase) <> 1 THEN
  163. SetNull(ls_codebase)
  164. GOTO ext
  165. END IF
  166. IF Pos(ls_codebase, 'file:///') > 0 THEN
  167. ls_codebase = Mid(ls_codebase, 9)
  168. END IF
  169. Long ll_pos
  170. ll_pos = Pos(ls_codebase, '/')
  171. DO WHILE ll_pos > 0
  172. ls_codebase = Replace(ls_codebase, ll_pos, 1, '\')
  173. ll_pos = Pos(ls_codebase, '/')
  174. LOOP
  175. ext:
  176. RETURN ls_codebase
  177. end function
  178. private function integer f_ifexist (string arg_regkey);String ls_value[]
  179. IF RegistryValues(arg_regkey, ls_value) = 1 THEN
  180. RETURN 1
  181. ELSE
  182. RETURN 0
  183. END IF
  184. end function
  185. private subroutine f_test ();String ls_path
  186. ls_path = "D:\workspace\__________test\MyTest\PBCOMTest\bin\Release\PBCOMTest.dll"
  187. String ls_netversion
  188. ls_netversion = "4.0"
  189. String ls_regkey
  190. ls_regkey = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework"
  191. String ls_valuename
  192. ls_valuename = "InstallRoot"
  193. String ls_frameworkpath
  194. IF RegistryGet(ls_regkey, ls_valuename, RegString!, ls_frameworkpath) <> 1 THEN
  195. MessageBox("", "没有安装.net Framework " + ls_netversion)
  196. GOTO ext
  197. END IF
  198. String ls_exec
  199. IF ls_netversion < "2.0" THEN
  200. ls_exec = ls_frameworkpath + "v1.1.4322\"
  201. ELSEIF ls_netversion < "4.0" THEN
  202. ls_exec = ls_frameworkpath + "v2.0.50727\"
  203. ELSE
  204. ls_exec = ls_frameworkpath + "v4.0.30319\"
  205. END IF
  206. ls_exec = ls_exec + "RegAsm.exe"
  207. IF Not FileExists(ls_exec) THEN
  208. MessageBox("", ls_exec + "不存在")
  209. GOTO ext
  210. END IF
  211. string ls_logfile
  212. ls_logfile= "tmp_reg.txt"
  213. ls_exec = "~"" + ls_exec + "~" ~"" + ls_path + "~" /codebase > ~"" + ls_logfile + "~" 2>&1"
  214. String ls_tmpfile
  215. ls_tmpfile = "tmp_reg.cmd"
  216. if fileexists(ls_tmpfile) then
  217. filedelete(ls_tmpfile)
  218. end if
  219. String arg_msg
  220. IF f_blobtofile(ls_tmpfile, Blob(ls_exec,EncodingANSI!), arg_msg) <> 1 THEN
  221. MessageBox("", arg_msg)
  222. GOTO ext
  223. END IF
  224. IF Run(ls_tmpfile) <> 1 THEN
  225. MessageBox("", "注册失败")
  226. GOTO ext
  227. END IF
  228. sleep(1)
  229. filedelete(ls_tmpfile)
  230. Blob lb_msg
  231. IF f_filetoblob(ls_logfile, lb_msg, arg_msg) <> 1 THEN
  232. MessageBox("", arg_msg)
  233. GOTO ext
  234. END IF
  235. filedelete(ls_logfile)
  236. arg_msg = string(lb_msg, EncodingANSI!)
  237. MessageBox('', arg_msg)
  238. ext:
  239. end subroutine
  240. private subroutine f_test1 ();oleobject obj
  241. obj = Create oleobject
  242. IF obj.ConnectToNewObject("PBCOMTest.Class3") <> 0 THEN
  243. MessageBox('', '未连接')
  244. GOTO ext
  245. END IF
  246. String ls_msg
  247. ls_msg = obj.HelloWorld("123")
  248. MessageBox('', ls_msg)
  249. ext:
  250. obj.DisconnectObject()
  251. Destroy obj
  252. end subroutine
  253. private function integer reg32dll (string arg_filepath, ref string arg_msg);Int rslt = 1
  254. IF Not FileExists(arg_filepath) THEN
  255. rslt = 0
  256. arg_msg = arg_filepath + '不存在'
  257. GOTO ext
  258. END IF
  259. String ls_exec = ""
  260. ls_exec = "C:\WINDOWS\system32\regsvr32.exe"
  261. IF Not FileExists(ls_exec) THEN
  262. rslt = 0
  263. arg_msg = ls_exec + "不存在"
  264. GOTO ext
  265. END IF
  266. String ls_logfile
  267. ls_logfile = "tmp_reg.txt"
  268. String ls_logfile1
  269. ls_logfile1 = "tmp_tmp.log"
  270. ls_exec = "~"" + ls_exec + "~" /s ~"" + arg_filepath + "~" > ~"" + ls_logfile1 + "~" 2>&1~r~nrename ~"" + ls_logfile1 + "~" ~"" + ls_logfile + "~""
  271. String ls_tmpfile
  272. ls_tmpfile = "tmp_reg.cmd"
  273. IF FileExists(ls_tmpfile) THEN
  274. FileDelete(ls_tmpfile)
  275. END IF
  276. IF FileExists(ls_logfile) THEN
  277. FileDelete(ls_logfile)
  278. END IF
  279. IF f_blobtofile(ls_tmpfile, Blob(ls_exec,EncodingANSI!), arg_msg) <> 1 THEN
  280. rslt = 0
  281. GOTO ext
  282. END IF
  283. IF Run(ls_tmpfile) <> 1 THEN
  284. rslt = 0
  285. arg_msg = "执行脚本失败," + ls_tmpfile
  286. GOTO ext
  287. END IF
  288. DO WHILE Not FileExists(ls_logfile)
  289. sleep(1)
  290. LOOP
  291. FileDelete(ls_tmpfile)
  292. Blob lb_msg
  293. IF f_filetoblob(ls_logfile, lb_msg, arg_msg) <> 1 THEN
  294. rslt = 0
  295. GOTO ext
  296. END IF
  297. FileDelete(ls_logfile)
  298. String ls_msg
  299. ls_msg = String(lb_msg, EncodingANSI!)
  300. arg_msg = ls_msg
  301. ext:
  302. RETURN rslt
  303. end function
  304. private function integer regdll (string arg_filepath, ref string arg_msg);//====================================================================
  305. // 事件: uo_reghelper.regdll()
  306. //--------------------------------------------------------------------
  307. // 描述: 注册.net的DLL
  308. //--------------------------------------------------------------------
  309. // 参数:
  310. // value string arg_filepath
  311. // reference string arg_msg
  312. //--------------------------------------------------------------------
  313. // 返回: integer
  314. //--------------------------------------------------------------------
  315. // 作者: lwl 日期: 2013年03月23日
  316. //--------------------------------------------------------------------
  317. // LONGJOE
  318. //--------------------------------------------------------------------
  319. // 修改历史:
  320. //
  321. //====================================================================
  322. IF ins_win32 THEN
  323. RETURN reg32dll(arg_filepath, arg_msg)
  324. END IF
  325. Int rslt = 1
  326. datastore lds_dllmap
  327. lds_dllmap = Create datastore
  328. lds_dllmap.DataObject = 'ds_dllmap'
  329. IF Not FileExists(arg_filepath) THEN
  330. rslt = 0
  331. arg_msg = arg_filepath + '不存在'
  332. GOTO ext
  333. END IF
  334. String ls_regkey
  335. ls_regkey = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework"
  336. String ls_valuename
  337. ls_valuename = "InstallRoot"
  338. String ls_frameworkpath
  339. IF RegistryGet(ls_regkey, ls_valuename, RegString!, ls_frameworkpath) <> 1 THEN
  340. rslt = 0
  341. arg_msg = "没有安装.net Framework"
  342. GOTO ext
  343. END IF
  344. String ls_exec = ""
  345. //IF DirectoryExists(ls_frameworkpath + "v4.0.30319\") THEN
  346. // ls_exec = ls_frameworkpath + "v4.0.30319\"
  347. //ELSEIF DirectoryExists(ls_frameworkpath + "v2.0.50727\") THEN
  348. // ls_exec = ls_frameworkpath + "v2.0.50727\"
  349. //ELSEIF DirectoryExists(ls_frameworkpath + "v1.1.4322\") THEN
  350. // ls_exec = ls_frameworkpath + "v1.1.4322\"
  351. //END IF
  352. String ls_dllname // 获取dll文件名
  353. IF LastPos(arg_filepath, '\') > 0 THEN
  354. ls_dllname = Mid(arg_filepath, LastPos(arg_filepath, '\') + 1)
  355. ELSE
  356. ls_dllname = arg_filepath
  357. END IF
  358. Long ll_row
  359. String ls_dotnetver = ''
  360. ll_row = lds_dllmap.Find('dllname="' + ls_dllname + '"', 1, lds_dllmap.RowCount())
  361. If (ll_row > 0) THEN
  362. ls_dotnetver = Trim(lds_dllmap.Object.dotnetver[ll_row])
  363. END IF
  364. CHOOSE CASE ls_dotnetver
  365. CASE '4.0'
  366. IF DirectoryExists(ls_frameworkpath + "v4.0.30319\") THEN
  367. ls_exec = ls_frameworkpath + "v4.0.30319\"
  368. ELSE
  369. rslt = 0
  370. END IF
  371. CASE '2.0'
  372. IF DirectoryExists(ls_frameworkpath + "v2.0.50727\") THEN
  373. ls_exec = ls_frameworkpath + "v2.0.50727\"
  374. ELSE
  375. rslt = 0
  376. END IF
  377. CASE '1.1'
  378. IF DirectoryExists(ls_frameworkpath + "v1.1.4322\") THEN
  379. ls_exec = ls_frameworkpath + "v1.1.4322\"
  380. ELSE
  381. rslt = 0
  382. END IF
  383. CASE ELSE
  384. IF DirectoryExists(ls_frameworkpath + "v4.0.30319\") THEN
  385. ls_exec = ls_frameworkpath + "v4.0.30319\"
  386. ELSEIF DirectoryExists(ls_frameworkpath + "v2.0.50727\") THEN
  387. ls_exec = ls_frameworkpath + "v2.0.50727\"
  388. ELSEIF DirectoryExists(ls_frameworkpath + "v1.1.4322\") THEN
  389. ls_exec = ls_frameworkpath + "v1.1.4322\"
  390. ELSE
  391. rslt = 0
  392. END IF
  393. END CHOOSE
  394. If (rslt = 0) And (ls_dotnetver <> '') THEN
  395. arg_msg = '本机没有安装.Net Framework ' + ls_dotnetver + '环境,请联系实施人员协助处理'
  396. GOTO ext
  397. ELSEIF rslt = 0 THEN
  398. arg_msg = '本机没有安装.Net Framework环境,请联系实施人员协助处理'
  399. GOTO ext
  400. END IF
  401. ls_exec = ls_exec + "RegAsm.exe"
  402. IF Not FileExists(ls_exec) THEN
  403. rslt = 0
  404. arg_msg = ls_exec + "不存在"
  405. GOTO ext
  406. END IF
  407. String ls_logfile
  408. ls_logfile = "tmp_reg.txt"
  409. String ls_logfile1
  410. ls_logfile1 = "tmp_tmp.log"
  411. ls_exec = "~"" + ls_exec + "~" /tlb:~""+Mid(arg_filepath, 1, Len(arg_filepath) - 4)+".tlb~" ~"" + arg_filepath + "~" /codebase > ~"" + ls_logfile1 + "~" 2>&1~r~nrename ~"" + ls_logfile1 + "~" ~"" + ls_logfile + "~""
  412. String ls_tmpfile
  413. ls_tmpfile = "tmp_reg.cmd"
  414. IF FileExists(ls_tmpfile) THEN
  415. FileDelete(ls_tmpfile)
  416. END IF
  417. IF FileExists(ls_logfile) THEN
  418. FileDelete(ls_logfile)
  419. END IF
  420. IF f_blobtofile(ls_tmpfile, Blob(ls_exec,EncodingANSI!), arg_msg) <> 1 THEN
  421. rslt = 0
  422. GOTO ext
  423. END IF
  424. IF Run(ls_tmpfile) <> 1 THEN
  425. rslt = 0
  426. arg_msg = "执行脚本失败," + ls_tmpfile
  427. GOTO ext
  428. END IF
  429. DO WHILE Not FileExists(ls_logfile)
  430. sleep(1)
  431. LOOP
  432. FileDelete(ls_tmpfile)
  433. Blob lb_msg
  434. IF f_filetoblob(ls_logfile, lb_msg, arg_msg) <> 1 THEN
  435. rslt = 0
  436. GOTO ext
  437. END IF
  438. FileDelete(ls_logfile)
  439. String ls_msg
  440. ls_msg = String(lb_msg, EncodingANSI!)
  441. arg_msg = Lower(ls_msg)
  442. IF Pos(arg_msg, 'error ra0000') > 0 And (Pos(arg_msg, '管理员') > 0 Or Pos(arg_msg, 'admin') > 0) THEN
  443. rslt = 0
  444. arg_msg = '注册"' + arg_filepath + '"失败,请以管理员身份运行本程序。详细信息:~r~n~r~n' + arg_msg
  445. ELSEIF Pos(arg_msg, 'success') <= 0 And Pos(arg_msg, '成功') <= 0 THEN
  446. rslt = 0
  447. END IF
  448. ext:
  449. Destroy lds_dllmap
  450. RETURN rslt
  451. end function
  452. public function integer unregdll (string arg_filepath, ref string arg_msg);//====================================================================
  453. // 事件: uo_reghelper.regdll()
  454. //--------------------------------------------------------------------
  455. // 描述: 注册.net的DLL
  456. //--------------------------------------------------------------------
  457. // 参数:
  458. // value string arg_filepath
  459. // reference string arg_msg
  460. //--------------------------------------------------------------------
  461. // 返回: integer
  462. //--------------------------------------------------------------------
  463. // 作者: lwl 日期: 2013年03月23日
  464. //--------------------------------------------------------------------
  465. // LONGJOE
  466. //--------------------------------------------------------------------
  467. // 修改历史:
  468. //
  469. //====================================================================
  470. if ins_win32 then
  471. return unreg32dll(arg_filepath, arg_msg)
  472. end if
  473. Int rslt = 1
  474. IF Not FileExists(arg_filepath) THEN
  475. rslt = 0
  476. arg_msg = arg_filepath + '不存在'
  477. GOTO ext
  478. END IF
  479. String ls_regkey
  480. ls_regkey = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework"
  481. String ls_valuename
  482. ls_valuename = "InstallRoot"
  483. String ls_frameworkpath
  484. IF RegistryGet(ls_regkey, ls_valuename, RegString!, ls_frameworkpath) <> 1 THEN
  485. rslt = 0
  486. arg_msg = "没有安装.net Framework"
  487. GOTO ext
  488. END IF
  489. String ls_exec = "",ls_exec1
  490. IF DirectoryExists(ls_frameworkpath + "v4.0.30319\") THEN
  491. ls_exec = ls_frameworkpath + "v4.0.30319\"
  492. ELSEIF DirectoryExists(ls_frameworkpath + "v2.0.50727\") THEN
  493. ls_exec = ls_frameworkpath + "v2.0.50727\"
  494. ELSEIF DirectoryExists(ls_frameworkpath + "v1.1.4322\") THEN
  495. ls_exec = ls_frameworkpath + "v1.1.4322\"
  496. END IF
  497. ls_exec = ls_exec + "RegAsm.exe"
  498. IF Not FileExists(ls_exec) THEN
  499. rslt = 0
  500. arg_msg = ls_exec + "不存在"
  501. GOTO ext
  502. END IF
  503. String ls_logfile
  504. ls_logfile = "tmp_reg.txt"
  505. String ls_logfile1
  506. ls_logfile1 = "tmp_tmp.log"
  507. ls_exec = "~"" + ls_exec + "~" ~"" + arg_filepath + "~" /unregister > ~"" + ls_logfile1 + "~" 2>&1~r~nrename ~"" + ls_logfile1 + "~" ~"" + ls_logfile + "~""
  508. //ls_exec = "~"" + ls_exec + "~"" + " " + arg_filepath + + " /unregister" + "~"" + "/codebase >" + "~"" + ls_logfile1 + "~" 2>&1~r~nrename ~"" + ls_logfile1 + "~" ~"" + ls_logfile + "~""
  509. String ls_tmpfile
  510. ls_tmpfile = "tmp_reg.cmd"
  511. IF FileExists(ls_tmpfile) THEN
  512. FileDelete(ls_tmpfile)
  513. END IF
  514. IF FileExists(ls_logfile) THEN
  515. FileDelete(ls_logfile)
  516. END IF
  517. IF f_blobtofile(ls_tmpfile, Blob(ls_exec,EncodingANSI!), arg_msg) <> 1 THEN
  518. rslt = 0
  519. GOTO ext
  520. END IF
  521. IF Run(ls_tmpfile) <> 1 THEN
  522. rslt = 0
  523. arg_msg = "执行脚本失败," + ls_tmpfile
  524. GOTO ext
  525. END IF
  526. DO WHILE Not FileExists(ls_logfile)
  527. sleep(1)
  528. LOOP
  529. FileDelete(ls_tmpfile)
  530. Blob lb_msg
  531. IF f_filetoblob(ls_logfile, lb_msg, arg_msg) <> 1 THEN
  532. rslt = 0
  533. GOTO ext
  534. END IF
  535. FileDelete(ls_logfile)
  536. String ls_msg
  537. ls_msg = String(lb_msg, EncodingANSI!)
  538. arg_msg = ls_msg
  539. IF Pos(arg_msg, 'success') <= 0 And Pos(arg_msg, '成功') <= 0 THEN
  540. rslt = 0
  541. END IF
  542. ext:
  543. RETURN rslt
  544. end function
  545. public function integer connecttonewobject (string arg_progid, string arg_filepath, ref oleobject arg_ole, ref string arg_msg);//====================================================================
  546. // 事件: uo_reghelper.connecttonewobject()
  547. //--------------------------------------------------------------------
  548. // 描述:
  549. //--------------------------------------------------------------------
  550. // 参数:
  551. // value string arg_progid 类名
  552. // value string arg_filepath DLL路径
  553. // reference oleobject arg_ole 要连接的oleobject
  554. // reference string arg_msg 返回失败信息
  555. //--------------------------------------------------------------------
  556. // 返回: integer
  557. //--------------------------------------------------------------------
  558. // 作者: lwl 日期: 2013年03月23日
  559. //--------------------------------------------------------------------
  560. // LONGJOE
  561. //--------------------------------------------------------------------
  562. // 修改历史:
  563. //
  564. //====================================================================
  565. Int rslt = 1
  566. IF sv_option_iftryreg AND pf_isadmin() THEN
  567. IF tryreg(arg_progid, arg_filepath, Ref arg_msg, False) <> 1 THEN
  568. rslt = 0
  569. GOTO ext
  570. END IF
  571. END IF
  572. IF arg_ole.ConnectToNewObject(arg_progid) <> 0 THEN
  573. rslt = 0
  574. arg_msg = '连接ole对象失败,' + arg_progid + ',' + arg_filepath
  575. GOTO ext
  576. END IF
  577. ext:
  578. RETURN rslt
  579. end function
  580. public function datetime pf_getfilecreatetime (string arg_filefullpathname);//pf_getfilecreatetime
  581. long rslt
  582. datetime createtime,errdatetime
  583. date ls_date
  584. time ls_time
  585. systemtime ls_systemtime
  586. filetime lpCreationTime ,lpLastAccessTime ,lpLastWriteTime
  587. long li_FileNum
  588. //
  589. li_FileNum = lOpen(arg_filefullpathname,0)
  590. rslt = GetFileTime (li_FileNum ,lpCreationTime ,lpLastAccessTime ,lpLastWriteTime )
  591. li_FileNum=lclose(li_FileNum)
  592. if rslt=0 then return errdatetime
  593. //rslt=FileTimeToSystemTime(lpCreationTime,ls_systemtime)//
  594. rslt=FileTimeToSystemTime(lpLastWriteTime,ls_systemtime)
  595. if rslt=0 then return errdatetime
  596. ls_date=date(string(ls_systemtime.wYear)+'.'+&
  597. string(ls_systemtime.wmonth)+'.'+&
  598. string(ls_systemtime.wDay))
  599. ls_time=time(string(ls_systemtime.wHour)+':'+&
  600. string(ls_systemtime.wMinute )+':'+&
  601. string(ls_systemtime.wSecond ))
  602. createtime =datetime(ls_date,ls_time)
  603. return createtime
  604. end function
  605. public function integer tryreg (string arg_progid, string arg_filepath, ref string arg_msg, boolean arg_if_delete);
  606. Int rslt = 1
  607. Long ll_pos
  608. String ls_path
  609. ls_path = arg_filepath
  610. ll_pos = Pos(ls_path, '\')
  611. IF ll_pos = 0 THEN
  612. IF sys_cur_path = '' THEN
  613. ls_path = pf_getfullpathname(arg_filepath)
  614. ELSE
  615. ls_path = sys_cur_path + arg_filepath
  616. END IF
  617. IF Not FileExists(ls_path) THEN
  618. ls_path = "C:\Windows\SysWOW64\" + arg_filepath
  619. IF Not FileExists(ls_path) THEN
  620. ls_path = "C:\Windows\System32\" + arg_filepath
  621. END IF
  622. END IF
  623. END IF
  624. IF Not FileExists(ls_path) THEN
  625. rslt = 0
  626. arg_msg = '文件不存在,' + ls_path
  627. GOTO ext
  628. END IF
  629. String ls_codebase
  630. ls_codebase = f_codebase(arg_progid)
  631. IF IsNull(ls_codebase) THEN
  632. GOTO reg
  633. END IF
  634. DateTime ld_org_date, ld_cur_date
  635. IF Lower(ls_codebase) <> Lower(ls_path) THEN
  636. IF Lower(ls_codebase) <> "" THEN
  637. IF FileExists(ls_codebase) THEN
  638. // DONE: 如果原来的较新 GOTO con
  639. ld_org_date = pf_getfilecreatetime(ls_codebase)
  640. ld_cur_date = pf_getfilecreatetime(ls_path)
  641. IF ld_cur_date <= ld_org_date THEN
  642. GOTO con
  643. END IF
  644. unregdll(ls_codebase, arg_msg)
  645. END IF
  646. END IF
  647. GOTO reg
  648. END IF
  649. GOTO con
  650. reg:
  651. String ls_msg
  652. IF regdll(ls_path, arg_msg) <> 1 THEN
  653. rslt = 0
  654. GOTO ext
  655. END IF
  656. ls_codebase = f_codebase(arg_progid)
  657. IF IsNull(ls_codebase) THEN
  658. rslt = 0
  659. arg_msg = ls_path + '文件中不存在对象:' + arg_progid + ',请联系软件供应商获取最新文件版本!'
  660. IF arg_if_delete THEN
  661. unregdll(ls_path, ls_msg)
  662. FileDelete(ls_path)
  663. arg_msg += '旧文件已被删除'
  664. END IF
  665. GOTO ext
  666. END IF
  667. IF Lower(ls_codebase) <> Lower(ls_path) THEN
  668. rslt = 0
  669. arg_msg = ls_path + '文件注册失败'
  670. GOTO ext
  671. END IF
  672. con:
  673. ext:
  674. RETURN rslt
  675. end function
  676. public function integer tryreg (string arg_progid, string arg_filepath, ref string arg_msg);return tryreg(arg_progid, arg_filepath, ref arg_msg, false)
  677. end function
  678. private function integer unreg32dll (string arg_filepath, ref string arg_msg);Int rslt = 1
  679. IF Not FileExists(arg_filepath) THEN
  680. rslt = 0
  681. arg_msg = arg_filepath + '不存在'
  682. GOTO ext
  683. END IF
  684. String ls_exec = ""
  685. ls_exec = "C:\WINDOWS\system32\regsvr32.exe"
  686. IF Not FileExists(ls_exec) THEN
  687. rslt = 0
  688. arg_msg = ls_exec + "不存在"
  689. GOTO ext
  690. END IF
  691. String ls_logfile
  692. ls_logfile = "tmp_reg.txt"
  693. String ls_logfile1
  694. ls_logfile1 = "tmp_tmp.log"
  695. ls_exec = "~"" + ls_exec + "~" /s /u ~"" + arg_filepath + "~" > ~"" + ls_logfile1 + "~" 2>&1~r~nrename ~"" + ls_logfile1 + "~" ~"" + ls_logfile + "~""
  696. String ls_tmpfile
  697. ls_tmpfile = "tmp_reg.cmd"
  698. IF FileExists(ls_tmpfile) THEN
  699. FileDelete(ls_tmpfile)
  700. END IF
  701. IF FileExists(ls_logfile) THEN
  702. FileDelete(ls_logfile)
  703. END IF
  704. IF f_blobtofile(ls_tmpfile, Blob(ls_exec,EncodingANSI!), arg_msg) <> 1 THEN
  705. rslt = 0
  706. GOTO ext
  707. END IF
  708. IF Run(ls_tmpfile) <> 1 THEN
  709. rslt = 0
  710. arg_msg = "执行脚本失败," + ls_tmpfile
  711. GOTO ext
  712. END IF
  713. DO WHILE Not FileExists(ls_logfile)
  714. sleep(1)
  715. LOOP
  716. FileDelete(ls_tmpfile)
  717. Blob lb_msg
  718. IF f_filetoblob(ls_logfile, lb_msg, arg_msg) <> 1 THEN
  719. rslt = 0
  720. GOTO ext
  721. END IF
  722. FileDelete(ls_logfile)
  723. String ls_msg
  724. ls_msg = String(lb_msg, EncodingANSI!)
  725. arg_msg = ls_msg
  726. ext:
  727. RETURN rslt
  728. end function
  729. public function string pf_getfullpathname (string arg_filename);//f_init_syscurpath(arg_msg)
  730. Long rslt = 1
  731. String lpBuffer
  732. lpBuffer = Fill('',200)
  733. Long lpfilepart,li_FileNum
  734. rslt = GetFullPathName(arg_filename,196,lpBuffer,lpfilepart)
  735. IF rslt = 0 THEN
  736. return arg_filename
  737. ELSE
  738. sys_cur_path = Left(lpBuffer,Len(lpBuffer)-Len(arg_filename))
  739. return lpBuffer
  740. END IF
  741. end function
  742. public function boolean pf_isadmin ();// DONE: 检查是否有注册表权限
  743. String ls_key
  744. ls_key = 'HKEY_LOCAL_MACHINE\SOFTWARE\LongJoe'
  745. String ls_name
  746. ls_name = 'testadmin'
  747. IF RegistrySet(ls_key, ls_name, RegString!, publ_operator) = 1 THEN
  748. RETURN True
  749. ELSE
  750. RETURN False
  751. END IF
  752. end function
  753. public subroutine set_sv_option_iftryreg (boolean arg_value);sv_option_iftryreg = arg_value
  754. end subroutine
  755. on uo_reghelper.create
  756. call super::create
  757. TriggerEvent( this, "constructor" )
  758. end on
  759. on uo_reghelper.destroy
  760. TriggerEvent( this, "destructor" )
  761. call super::destroy
  762. end on