Atozed Forums

Full Version: TIWSSLOptions::SetPortA
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Edition: IntraWeb Ultimate Edition
IntraWeb Version: 15.5.5
C++Builder: 12

[ilink32 Fehler] Error: Nicht auflösbares externes '__fastcall Iwservercontrollerbase::TIWSSLOptions::SetPortA(const int)' referenziert von ...\WIN32\DEBUG\SERVERCONTROLLER.OBJ
[ilink32 Fehler] Error: Linken kann nicht ausgeführt werden

As of version IW15.5.4, the port property function has been changed in IWServerControllerBase.hpp:
old: __property int Port = {read=FPort, write=FPort, default=0};
new: __property int Port = {read=FPort, write=SetPort, default=0};

Unfortunately, the pragma entry required to redirect the property functions SetPortA()/SetPortW is missing.
(please refer //-- user supplied --)
(01-14-2024, 10:37 AM)JuergenS Wrote: [ -> ][ilink32 Fehler] Error: Nicht auflösbares externes '__fastcall Iwservercontrollerbase::TIWSSLOptions::SetPortA(const int)' referenziert von ...\WIN32\DEBUG\SERVERCONTROLLER.OBJ
[ilink32 Fehler] Error: Linken kann nicht ausgeführt werden

Oh, how fun that SetPort() is still rearing its ugly head after decades of plaguing people!

(01-14-2024, 10:37 AM)JuergenS Wrote: [ -> ]As of version IW15.5.4, the port property function has been changed in IWServerControllerBase.hpp:
old: __property int Port = {read=FPort, write=FPort, default=0};
new: __property int Port = {read=FPort, write=SetPort, default=0};

Unfortunately, the pragma entry required to redirect the property functions SetPortA()/SetPortW is missing.

In Indy, there are several Port properties that are affected by this issue.  I resolved it the same way Borland/Embarcadero did in the VCL - by adding appropriate C++ #pragma alias statements via HPPEMIT directives to each affected Delphi unit, eg:

Code:
// in IdIOHandler.pas: procedure SetPort(AValue: Integer); virtual;
(*$HPPEMIT '#if defined(_VCL_ALIAS_RECORDS)' *)
(*$HPPEMIT '#if !defined(UNICODE)' *)
(*$HPPEMIT '#pragma alias "@Idiohandler@TIdIOHandler@SetPortA$qqri"="@Idiohandler@TIdIOHandler@SetPort$qqri"' *)
(*$HPPEMIT '#else' *)
(*$HPPEMIT '#pragma alias "@Idiohandler@TIdIOHandler@SetPortW$qqri"="@Idiohandler@TIdIOHandler@SetPort$qqri"' *)
(*$HPPEMIT '#endif' *)
(*$HPPEMIT '#endif' *)

Code:
// in IdIPMCastBase.pas: procedure SetPort(const Value: integer); virtual;
(*$HPPEMIT '#if defined(_VCL_ALIAS_RECORDS)' *)
(*$HPPEMIT '#if !defined(UNICODE)' *)
(*$HPPEMIT '#pragma alias "@Idipmcastbase@TIdIPMCastBase@SetPortA$qqrxi"="@Idipmcastbase@TIdIPMCastBase@SetPort$qqrxi"' *)
(*$HPPEMIT '#else' *)
(*$HPPEMIT '#pragma alias "@Idipmcastbase@TIdIPMCastBase@SetPortW$qqrxi"="@Idipmcastbase@TIdIPMCastBase@SetPort$qqrxi"' *)
(*$HPPEMIT '#endif' *)
(*$HPPEMIT '#endif' *)

Code:
// in IdTCPClient.pas: procedure SetPort(const AValue: TIdPort); virtual;
(*$HPPEMIT '#if defined(_VCL_ALIAS_RECORDS)' *)
(*$HPPEMIT '#if !defined(UNICODE)' *)
(*$HPPEMIT '#pragma alias "@Idtcpclient@TIdTCPClientCustom@SetPortA$qqrxus"="@Idtcpclient@TIdTCPClientCustom@SetPort$qqrxus"' *)
(*$HPPEMIT '#else' *)
(*$HPPEMIT '#pragma alias "@Idtcpclient@TIdTCPClientCustom@SetPortW$qqrxus"="@Idtcpclient@TIdTCPClientCustom@SetPort$qqrxus"' *)
(*$HPPEMIT '#endif' *)
(*$HPPEMIT '#endif' *)

And a few others... Note the difference in the decorated names due to the different ways that the input parameter to SetPort() is declared.

In retrospect, it would have been cleaner to just rename each class's SetPort() method instead to something more unique that didn't clash with the Win32 API, such as SetPortNumber() or something like that.
Any solution is welcome
It's been fixed in our code base and will be delivered in a new update soon.
@Remy, not as funny as it looks from the outside :-)

That's the second time that something like that happens in our codebase, IIRC.

Thanks for your input. It saved me some time scratching my head....
It's working now with IW 15.5.6

Thanks for your help