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.
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