Я пытаюсь использовать цифровую сферу Vellman PCSU1000 в одном из моих проектов, которые я пишу на C ++ в Visual Studio 2010.
Для этого мне нужно использовать две библиотеки DLL, предоставляемые производителем устройства: DSOLink.dll и PCSU1000D.dll. У меня нет других связанных файлов. Насколько я понял из руководства, эти DLL были написаны и скомпилированы в Deplhi. Существует краткое описание функций, содержащихся в каждой из DLL и как их использовать на разных языках программирования. Для языка C ++ производитель выбрал Borland C ++ Builder и добавил следующий код (для использования DSOLink.dll он аналогичен PCSU1000D.dll):
DSOLink.h
//---------------------------------------------------------------------------
// DSOLink.h
#ifdef __cplusplus
extern "C" { /* Assume C declarations for C++ */
#endif
#define FUNCTION __declspec(dllimport)
FUNCTION bool __stdcall DataReady(); /*this particular line is added by me based on
list of the functions listed by dumpbin/exports DSOlink.dll and manual*/
FUNCTION __stdcall ReadCh1(int* ptr);
FUNCTION __stdcall ReadCh2(int* ptr);
#ifdef __cplusplus
}
#endif
//---------------------------------------------------------------------------
Согласно инструкции, найденной в MSDN: http://support.microsoft.com/kb/131313
Я создал файл .lib. Благодаря этому Построить решение заканчивается успешно, но отладка возвращает сообщение об ошибке «Не удается найти точку входа функции _DataReady @ 0 в DSOLink.dll».
Из статьи: http://bcbjournal.org/articles/vol4/0012/Using_Visual_C_DLLs_with_CBuilder.htm?PHPSESSID=ab5f6c83b3da921591a490a5accb5bf7 Я знаю, что в C ++ Builder ключевое слово * __stdcall * указывает на отсутствие декорации, в то время как в VS означает прямо противоположное.
Я понимаю, что в этой ситуации я вынужден использовать * __stdcall * в VS (это должен быть тот же метод управления очисткой стека в DLL и в заголовке, который используется в приложении) и метод без декорации одновременно … Я читал, что файлы .DEF могут помочь, но я теряюсь, как именно это следует использовать. Я пытался создать DEF по-разному:
EXPORTS
DataRead=DataRead
.
.
.
EXPORTS
DataRead=_DataRead@0
.
.
.
EXPORTS
_DataRead@0=DataRead
.
.
.
и добавил один из них сразу в мой проект, но ни один из них не решает проблему.
Кто-нибудь имеет представление о том, как правильно заставить VS не использовать и не ожидать, что украшенные имена будут * __stdcall *?
Или, может быть, причина моей проблемы в чем-то другом, и кто-то знает это?
Заранее спасибо.
Задача ещё не решена.
Других решений пока нет …