Я был без доступа к компьютеру, так что, надеюсь, вы уже решили это. Я думаю, что проблема в том, что использование «\» для завершения строки на самом деле говорит препроцессору C слить следующую строку с этой строкой. См. Комментарий 3 на этой странице , а сращивание строк здесь . Это работает нормально для большинства операторов C, но более проблематично для сборки, так как новые строки - это то, как он разделяет операторы.
Я могу придумать два подхода к решению. Во-первых, найти что-то вроде C ";" который может использоваться как разделитель статов в сборке, я не знаю, существует ли такая вещь. Второй подход заключается в том, чтобы обернуть все в отдельные __asm
операторы. При втором подходе вы получаете следующее:
void __declspec(naked) ##name##CancelCommonDialogHook(void)
{
__asm{add esp, [k##name##CancelCommonDialogStackOffset]} \
__asm{jz RESTORE} \
__asm{jmp [k##name##CancelCommonDialogNewFileRetnAddr]} \
RESTORE: \
__asm{pushad} \
__asm{call DoSavePluginCommonDialogHook} \
__asm{test eax, eax} \
__asm{jnz REMOVE} \
__asm{popad} \
__asm{jmp [k##name##CancelCommonDialogRestoreRetnAddr]} \
REMOVE: \
__asm{popad} \
__asm{jmp [k##name##CancelCommonDialogRemoveRetnAddr]} \
}
ПРИМЕЧАНИЕ. Я оставил метки вне операторов asm, потому что:
- Я думаю, что вы можете
- Я не уверен в правилах области видимости для меток, определенных в
__asm
блоков