2016-02-01 2 views
2

Я пытаюсь ссылаться на функции в стороннем DLL-файле через CAPL Script. Поскольку я не могу напрямую их вызвать, я пытаюсь создать оболочку, которая экспортирует функции в dll.Как загрузить DLL в VS C++, который действует как оболочка на другой код CAPL?

int MA_Init(char *TbName, int Option); является функцией в файле dll.

код обертки для этого

int CAPLEXPORT far CAPLPASCAL CMA_Init(char *TbName, int Option) 
{ 
return MA_Init(*TbName, Option); 
} 

Я пытаюсь использовать

HINSTANCE DllHandel = loadlibrary("C:\\Turbo.dll"); загрузить библиотеку и

typedef int(*TESTFnptr)(char, int); TESTFnptr fn= (TESTFnptr)getprocaddress(DllHandle, "MA_Init"); разрешить адрес функции.

Однако компилятор говорит, что функция "MA_Init()" не определена. Я не уверен, использую ли я правильную процедуру для загрузки dll в мой визуальный проект на C++. Кто-нибудь пытался это сделать или знает, как это делается? Большое спасибо.

ответ

0

Стандартной процедурой является включение соответствующего файла .lib в проект VS. Перейдите к «Project - Properties - Свойства конфигурации - Linker - Additional Dependencies» и добавьте turbo.lib в новую строку. Затем вам нужно будет включить соответствующий заголовочный файл turbo.h, который содержит определение для функции MA_Init.

В этом случае вы можете напрямую позвонить MA_Init, как и сейчас. Компилятор с радостью найдет определение MA_Init в файле заголовка, и компоновщик найдет ссылку на MA_Init в файле .lib.

Если у вас нет файла turbo.h, вы можете создать его самостоятельно, если знаете прототипы всех функций, которые хотите использовать. Просто введите определения, такие как

int MA_Init(char *TbName, int Option); 

и включите его.

Если у вас нет файла turbo.lib, вам необходимо обратиться к LoadLibrary и GetProcAddress. Очевидно, вы не можете назвать MA_Init по имени в этом случае, так как он не определен. Вам придется вызвать указатель, возвращаемый GetProcAddress вместо:

TESTFnptr fn = (TESTFnptr)GetProcAddress(DllHandle, "MA_Init"); 
int CAPLEXPORT far CAPLPASCAL CMA_Init(char *TbName, int Option) 
{ 
    return fn(TbName, Option); 
} 

PS. Заметьте, что я удалил старт перед TbName?

PPS. Не забудьте включить вашу обертку, CMA_Init, в CAPL_DLL_INFO_LIST, иначе она не будет доступна в CANoe/CANalyzer.