2012-06-19 5 views
1

Я наткнулся на раздел на MSDN этим вечером, рассказывая о вариантах #pragma. В частности, определение #pragma comment.Как я могу получить данные комментария #pragma во время выполнения?

Можно ли вытащить эту информацию во время выполнения (чтобы определить, на какой машине был сгенерирован какой-то исходный код, например)? Если да, то как?

Например, как я мог бы получить дату компиляции, если бы я добавить следующее #pragma:

pragma comment(user, "Compiled on " __DATE__ " at " __TIME__) 
+0

@ildjarn: Вы недостаточно читали документацию, Сева была правка о '#pragma comment'. –

+0

@Ben: Это утверждение противоречит вашему собственному ответу, если я не ошибаюсь в значении «* компоновщик не обрабатывает запись комментариев *». – ildjarn

+0

@ildjarn: В какой версии моего ответа вы смотрите? –

ответ

4

Строка «Составитель на» ... на самом деле в двоичном, но это напрямую не доступен , Что вам нужно сделать, это на самом деле сканировать исполняемый файл, чтобы найти эту строку. Это создает собственный набор проблем (например, как вы находите иглу, которая является вашей строкой в ​​стоге сена, которая является кодом) без какого-либо «маркера», чтобы сказать вам «ага! Вот оно!».

Почему бы не сделать что-то подобное, чтобы сделать вашу жизнь проще?

static const char *sCompileInfo = "Compiled on " __DATE__ " at " __TIME__ 
+0

Yup, справедливая точка - просто увидела это мимоходом и подумала, что это еще одна легко доступная метрика. В последнее время я делаю загрузку материалов с отслеживаемостью и приветствую больше способов определить, что было скомпилировано там и тому подобное. static const char с той же информацией более полезен, если программа работает, но возможность извлекать информацию из исполняемых файлов, libs и .dll без использования какого-либо кода также может быть полезна при некоторых обстоятельствах. –

+0

@Jon: Тогда, возможно, вы хотите Ресурс VERSIONINFO? –

+0

@Ben, который выглядит так, может быть очень полезным :-) –

2

Согласно странице MSDN вы цитируемая содержание #pragma comment заканчивается в бинарном только тогда, когда комментарии тип является exestr. Ваш пример имеет тип user, и в документации очень четко сказано, что он не будет связан. Более того, даже тип exestr больше не обрабатывается (опять же, документация вызывает это).


Для комментария, хранящегося в бинарном файле, который можно получить позже без выполнения программы, попробуйте встраивание ресурс VERSIONINFO в исполняемый файл с rc.exe, и читать его с помощью функции GetFileVersionInfoEx. Также могут быть эффективны типы ресурсов STRINGTABLE.

Смежные вопросы