Resolver “o ordinal NNN não foi localizado em ace64.dll”
Sintoma
Após colocar ace64.dll (ou ace32.dll) do OpenADS no PATH
de uma aplicação existente, o Windows exibe:
O ponto de entrada do procedimento no ordinal 328 não foi localizado na biblioteca de vínculos dinâmicos
ace64.dll.
O número varia (328, 415, …). A aplicação aborta.
Causa
A aplicação ou seu rddads.lib foi linkada contra uma import
library ace32.lib / ace64.lib que registra imports por
ordinal, não por nome. Cada Ads* vive num ordinal
específico (1, 2, 3, …, 328, …) dentro do DLL SAP. O loader
do Windows procura esse ordinal no novo DLL — e falha, porque
o .def upstream do OpenADS só declara exports por nome e
os ordinais são auto-atribuídos em ordem de arquivo fonte.
Os números não batem com os do SAP.
OpenADS implementa cada função Ads* clean-room — os
nomes são públicos (contrib/rddads do Harbour os chama
por nome). Falta apenas o mapeamento numérico ordinal →
nome. Esse mapeamento vive no DLL SAP que o usuário já
possui legalmente; nunca lemos código-fonte SAP. Um script
helper extrai o mapeamento localmente na máquina do usuário.
Solução — uma única vez no Win com DLL SAP
1. Despejar tabela de exports SAP
No Developer Command Prompt:
dumpbin /exports ace64.dll > ace64-exports.txt
2. Converter em .def para OpenADS
python tools\scripts\sap_ordinals_to_def.py ace64-exports.txt > openads_ace_ordinals.def
3. Recompilar OpenADS com o .def custom
cmake -S . -B build\ord -DOPENADS_ACE_DEF=%CD%\openads_ace_ordinals.def
cmake --build build\ord --target openads_ace --config Release
O build\ord\src\Release\ace64.dll resultante mantém cada
nome de função + atribui o ordinal que SAP escolheu. Drop-in
sobre o PATH da app — os lookups por ordinal do loader
agora atingem o símbolo correto.
Caminho alternativo recomendado
Se a aplicação puder ser re-linkada, não precisa do truque de ordinais. Gere uma import library do DLL OpenADS (que exporta por nome):
lib /def:openads_ace.def /machine:x64 /out:ace64.lib
…e re-linke rddads e a app contra esse ace64.lib. Vincula
por nome, sem acoplamento a ordinais. É a opção future-proof.
Por que não distribuímos ace64-exports.txt upstream
A tabela de exports é metadata sobre um binário que OpenADS não envia e não possui. Re-publicá-la dentro deste repo significaria redistribuir dados extraídos de um binário SAP, o que conflita com a política clean-room. Cada usuário gera sua cópia localmente de um binário que já tem direito legal de inspecionar.