Как использовать функцию из другого проекта?
У меня в одном решении есть два проекта. Оба генерируют dll. Я хочу в одном из проектов использовать функцию, которая определена в другом проекте. Как это сделать? Я добавил ссылку на проект, в котором определена функция, в проект, в котором она должна использоваться.
Ответы (1 шт):
Решение для windows:
Сделать заголовочный файл, который будет подключаться во втором проекте.
В первом же проекте в его свойствах надо задать, чтоб при сборке определялся макрос __PROJECT_1_.
#ifndef __PROJECT_1_HEADER_INCLUDED_
#define __PROJECT_1_HEADER_INCLUDED_
#ifdef __PROJECT_1_
# define PROJECT_1_API __declspec(dllexport)
#else
# define PROJECT_1_API __declspec(dllimport)
#endif // __PROJECT_1_
#ifdef __cplusplus
extern "C" {
#endif // __cplusplus
PROJECT_1_API
void __stdcall Project1Func( void* param1, DWORD dwParam2 );
// Именно typedef, а не using, потому что эти объявления должны быть "сишными"
typedef void (__stdcall* PFnProject1Func)(void*, DWORD);
// Имя тоже понадобится
#define szProject1Func "Project1Func"
#ifdef __cplusplus
} // extern "C"
#endif // __cplusplus
#endif // !__PROJECT_1_HEADER_INCLUDED_
Во втором же проекте надо подгрузить функцию:
#include "../Common/Proj1.h"
// ...
HMODULE hProj1Dll = LoadLibrary( "Proj1.dll" );
if(!hProj1Dll) {
// Error
}
PFnProject1Func pfnProject1Func = (PFnProject1Func)GetProcAddress( hProj1Dll, szProject1Func );
if(!pfnProject1Func) {
// Error
}
// Освободим библиотеку
FreeLibrary( hProj1Dll );
// Далее используем вызов по указателю:
pfnProject1Func( param1, param2 );
Вопрос задан с тегом "С", поэтому решение "сишное". Если проекты собираются для С++, то можно ничего не менять, а можно и заменить C-cast на reinterpret_cast, в той же строчке PFnProject1Func – на auto, так как в reinterpret_cast'e и так тип будет указан. Также инклюд-гард можно на #pragma once заменить.
Для С++ может понадобиться добавить в первый проект *.def файл со списком экспортируемых функций для того, чтоб имена функций были недекорированными при экспорте на всех платформах.