Und selbst wenn, diese ID diente nur der internen Verwaltung und ändert sich spätestens bei einer Kopie, sonst wäre die ID ja nicht eindeutig.

Jedes Objekt identifiziert sich durch das Einspeicher-Konzept letztlich durch seine 128-Bit-Adresse (16-Byte-Pointer), die auf LIB/OBJ/OBJART verweist.

Und wie Holger schon beschreibt, je nach Maschinenmodell kann sich ein Programmobjekt durch internen Recompile bereits unterscheiden.

Bei Dateien kannst du (nicht bei SQL) sicherlich auf die Format-ID referieren, die aber z.B. den aktuellen Key NICHT mit einschließt.
Hierfür mußt du dann per DSPFD(-API) die Keylisten vergleichen.

Aber wie bereits oben mitgeteilt mußt du je Objektart einen eigenen Weg beschreiten.

Und:
Letztendlich ist der Softwarelieferant ja für die korrekte Version und ggf. Versionsprüfung verantwortlich und (je nach Vertrag) auch in Regress zu nehmen.