rexx-things/modules/windows/ole/oleinfo/getOleConstants.rex
2025-03-12 20:50:48 +00:00

183 lines
7.9 KiB
Rexx

/*----------------------------------------------------------------------------*/
/* */
/* Copyright (c) 2002-2022 Rony G. Flatscher. All rights reserved. */
/* Copyright (c) 2023 Rexx Language Association. All rights reserved. */
/* */
/* This program and the accompanying materials are made available under */
/* the terms of the Common Public License v1.0 which accompanies this */
/* distribution. A copy is also available at the following address: */
/* https://www.oorexx.org/license.html */
/* */
/* Redistribution and use in source and binary forms, with or */
/* without modification, are permitted provided that the following */
/* conditions are met: */
/* */
/* Redistributions of source code must retain the above copyright */
/* notice, this list of conditions and the following disclaimer. */
/* Redistributions in binary form must reproduce the above copyright */
/* notice, this list of conditions and the following disclaimer in */
/* the documentation and/or other materials provided with the distribution. */
/* */
/* Neither the name of Rexx Language Association nor the names */
/* of its contributors may be used to endorse or promote products */
/* derived from this software without specific prior written permission. */
/* */
/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */
/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */
/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */
/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */
/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */
/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */
/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */
/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */
/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */
/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */
/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
/* */
/*----------------------------------------------------------------------------*/
/***********************************************************************
name: getOleConstants.rex
purpose: create an Object Rexx file which saves the constants of the given
OLE/ActiveX appId/clsId in a directory called "ole.const" in the
environment .local (and hence can be retrieved by the environment
symbol ".ole.const")
usage: getOleConstants appid/clsid [outfile]
appid/clsid ... OLE/ActiveX application ID or CLSID
outfile ....... optional name of the outputfile, otherwise STDOUT is used
use the above outfile in a "::requires" directive
which then allows you to use the defined constants,
e.g. ".ole.const~SWC_3RDPARTY"
example: rexx getOleConstants InternetExplorer.Application msie_const.rex
... then, whenever you need to access MSIE-constants, then merely use
"::requires msie_const.rex" and refer to them e.g. like
".ole.const~csc_navigateBack"
***********************************************************************/
if arg()=0 then -- show usage
do
say .resources~usage
exit
end
parse arg appId outFile
-- ole=.oleobject~new(appId) -- get OLE proxy
ole=createOleObject(appId) -- try to create OLE proxy
if ole=.nil then
do
.error~say(appId": could not create the OLE proxy, aborting ...")
exit -1
end
oleconst="ole.const" -- define directory name to store OLE constants, change if needed
-- get OLE constants, create sortable stem
constants.=ole~getConstant
stem. = .stem~new
stem.0=0
max=0
do counter i idx over constants.
idx=substr(idx,2) -- remove leading "!" character
stem.i=idx || "09"x || ole~getConstant(idx)
stem.0=i
max=max(max, length(idx)) -- save longest constant name
end
-- if no constants, abort
if stem.0=0 then
do
.error~say("No constants found for:" pp(appId)", aborting ..." )
exit -1
end
call SysStemSort "stem.", "A", "I" -- sort stem
-- dump infos
parse source . . thisPgm
-- open file-stream
if outfile="" then of=.output -- appId"_constants.rex"
else of=.stream~new(strip(outFile))~~open("write replace")
of~say("/*" pp(filespec("name", thisPgm)) "run on:" pp(.dateTime~new) "*/" )
of~say
tmpStr1="are"
tmpStr2="constants"
if stem.0=1 then -- singular
do
tmpStr1="is"
tmpStr2="constant"
end
of~say("-- OLE/ActiveX-application/clsid:" pp(appId) "- there" tmpStr1 pp(stem.0) tmpStr2 )
of~say
of~say("-- create stringTable '"OLECONST"', if necessary; maybe shared with OLE constant definitions of other programs")
of~say("if .local~hasentry('"oleconst"')=.false then .local~"oleconst"=.stringTable~new -- create stringTable '"OLEconst"' in .local")
of~say
do i=1 to stem.0
parse var stem.i const "09"x value
of~say( '.'oleconst'~'left(const, max) '=' encode(value) )
end
of~close
::routine pp
return "[" || arg(1)~string || "]"
::routine encode -- if a number, leave unchanged, else escape quotes Rexx-style, enclose string into quotes
if datatype(arg(1), "Number") & length(arg(1))<=digits() then return arg(1) -- if a number, return value unchanged
quote='"'
tmp=changestr(quote, arg(1), quote||quote)
return quote || tmp || quote
::resource usage -- usage instructions
usage: getOleConstants appid/clsid [outfile]
appid/clsid ... OLE/ActiveX application ID or CLSID
outfile ....... optional name of the outputfile, otherwise STDOUT is used
use the above outputfile in a "::requires" directive
which then allows you to use the defined constants,
e.g. ".ole.const~SWC_3RDPARTY"
example: rexx getOleConstants InternetExplorer.Application msie_const.rex
... creates an ooRexx program named "msie_const.rex" which adds
all found constants to the .ole.const stringTable (ooRexx 5.0,
like a directory)
... then, whenever you need to access MSIE-constants, merely use
::requires "msie_const.rex"
in your program. This makes the InternetExplorer constants
available via the environment symbol ".ole.const" such that
you can refer to the constants by name in your programs like:
val=.ole.const~csc_navigateBack -- get the constant
Note: you can require as many different ole constant files as
necessary in a single program; all constants will get
saved in ".ole.const"
::END
/** Makes sure that program does not get stopped if OLEObject cannot be created (e.g. SYNTAX 92.911),
rather return .nil in that case. */
::routine createOleObject
use strict arg appId
signal on syntax
return .oleobject~new(appId) -- get OLE proxy
syntax:
return .nil