NEWCOM works fairly well with ISHELLLINK; however the .getpath fails when the link is a .URL and .getarguments seems to fail completely.
I have tried to figure out a way to use NEWCOM retrieve the target path for a .URL but have failed to do so.
Here is an excerpt of the code I am using:
I can do all of the above using cocreateinstance.
PS:
Code tags do not seem to work with cut and paste
I have tried to figure out a way to use NEWCOM retrieve the target path for a .URL but have failed to do so.
Here is an excerpt of the code I am using:
Code:
LET LnkPtr = NEWCOM CLSID $CLSID_ShellLink IF ISNOTHING(LnkPtr) THEN ? "newcom failed" END END IF LET PrstPtr = LnkPtr FOR I = NumFiles TO N Wstr = tLnk(I).LnkPath Ok = INSTR(-1, UCASE$(Wstr), ".URL") IF Ok THEN LOCAL CLSID_UrlLink AS GUID CLSID_UrlLink = GUID$("{FBF23B40-E3F0-101B-8488-00AA003E56F8}") CLSID_UrlLink = $CLSID_InternetShortcut ' LET UrlLnkPtr = NEWCOM CLSID CLSID_UrlLink '<-- ERROR HERE IF ISNOTHING(UrlLnkPtr) THEN '<---- passes through ? "Internet ptr failed" END END IF Ok = UrlPrstPtr.Load(Wstr, %STGM_READ) '<--- GPF HERE Ok = UrlLnkPtr.Resolve(0, %SLR_ANY_MATCH OR %SLR_NO_UI) Ok = UrlLnkPtr.GetPath(WstrZ, %MAX_PATH, tFndDta, %SLGP_UNCPRIORITY) tLnk(I).ExePath = WstrZ Ok = UrlLnkPtr.GetDescription(WstrZ, %MAX_PATH) tLnk(I).Describe = WstrZ Ok = UrlLnkPtr.GetArguments(WstrZ, 1024) tLnk(I).Cmd = Wstrz A$ = A$ + RTRIM$(tLnk(I).ExePath, ANY ($NUL + $SPC)) + " | " + _ RTRIM$(tLnk(I).Cmd, ANY ($NUL + $SPC)) + $CR UrlPrstPtr = NOTHING UrlLnkPtr = NOTHING ITERATE FOR END IF Ok = PrstPtr.Load(Wstr, %STGM_READ) IF Ok <> %S_OK THEN ? "link load failed " + STR$(I) + $CR + Wstr ITERATE FOR EXIT FUNCTION END IF Ok = LnkPtr.Resolve(0, %SLR_ANY_MATCH OR %SLR_NO_UI) IF Ok <> %S_OK THEN ? "link resolve failed" EXIT FUNCTION END IF Ok = LnkPtr.GetPath(WstrZ, %MAX_PATH, tFndDta, %SLGP_UNCPRIORITY) IF Ok <> %S_OK THEN ? "link getpath failed" EXIT FUNCTION END IF Wstr = WstrZ tLnk(I).ExePath = WstrZ Ok = LnkPtr.GetDescription(WstrZ, %MAX_PATH) IF Ok <> %S_OK THEN ? "link describe failed" EXIT FUNCTION END IF tLnk(I).Describe = WstrZ Ok = LnkPtr.GetArguments(WstrZ, 1024) IF Ok <> %S_OK THEN ? "link Argumens failed" EXIT FUNCTION END IF tLnk(I).Cmd = Wstrz Ok = LnkPtr.GetWorkingDirectory(WstrZ, %MAX_PATH) IF Ok <> %S_OK THEN ? "link workdir failed" EXIT FUNCTION END IF tLnk(I).WrkPath = WstrZ A$ = A$ + RTRIM$(tLnk(I).ExePath, ANY ($NUL + $SPC)) + " | " + _ RTRIM$(tLnk(I).Cmd, ANY ($NUL + $SPC)) + $CR NEXT I ? A$ EXIT FUNCTION
I can do all of the above using cocreateinstance.
PS:
Code tags do not seem to work with cut and paste
Comment