2014-11-19 7 views
0

Я пишу программу для преобразования изображения и сравнения скорости обработки данных в C и сборке. У меня есть 3 проекта:MASM: Доступ к глобальной переменной C из сборки

  • главный проект в C
  • DLL в C, чтобы преобразовать изображение
  • DLL в ASM, чтобы преобразовать изображение

В заголовке DLL C, я просто написал:

#ifdef PROJEKTC_EXPORTS 
    #define PROJEKTC_API __declspec(dllexport) 
#else 
    #define PROJEKTC_API __declspec(dllimport) 
#endif 

... 

extern PROJEKTC_API unsigned int ThreadID;  

PROJEKTC_API void __cdecl funkcjaC(void* Args); 

и после включения этого заголовка я могу получить доступ к переменной ThreadID как в основном проекте, так и в C DLL.

Проблема начинается, когда я пытаюсь сделать то же самое в ASM. Я пробовал конструкции вроде extern ASMThreadID:dword в блоке .code, но это не сработает.

ошибка я получил: error LNK2019: unresolved external symbol _ASMThreadID referenced in function _MyProc1

У меня есть ощущение, что это вопрос 1-2 строк кода, но я не могу понять, какие инструкции я должен использовать.

Я связываю проекты по файлу определения модуля в ASM и добавляю файл ASM.lib в Linker-> Input основного проекта.

Есть ли у вас какие-либо предложения?

+0

Скомпилировать версию C библиотеки DLL, собрать компилятор, и посмотреть, как это делается на нашей платформе? Этот материал зависит от реализации. – EOF

+0

Вы имеете в виду Демонтаж окна? Я использую Visual Studio 2010 в Windows 7 64-bit, к сожалению, он не показывает сборку для этой части кода ... Я имею в виду, в C DLL .c файле у меня есть глобальная переменная: PROJEKTC_API unsigned int ThreadID = 0; и он работает блестяще. К сожалению, я не знаю, как экспортировать переменную из ASM в C. Где и как мне объявить переменную, чтобы она экспортировалась за пределы DLL. Как использовать __declspec (dllexport) в сборке. – Trimack

+0

C иногда добавляет символы подчеркивания к имени. Вы пытались просто добавить подчеркивание, когда объявляете переменную в asm? И вы объявляете его «публичным» в своем asm, да? –

ответ

0

С небольшой помощью от старых постов в asmcommunity.net, мне удалось получить его работу:

  • В .asm файл перед .data сегмент:

EXTERNDEF C ASMThreadID:DWORD

  • В сегменте данных:

ASMThreadID dd 0

  • В .def файл ASM DLL:

LIBRARY "nameOfProject" EXPORTS ... ASMThreadID

  • В главном заголовке программы C (например, глобальной декларации):

extern __declspec(dllimport) unsigned int ASMThreadID;

Теперь он работает как шарм.

«Публичная» декларация направила меня на правильный путь поиска. Спасибо за вашу помощь, приятель!

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