Как использовать функцию из другого проекта?

У меня в одном решении есть два проекта. Оба генерируют dll. Я хочу в одном из проектов использовать функцию, которая определена в другом проекте. Как это сделать? Я добавил ссылку на проект, в котором определена функция, в проект, в котором она должна использоваться.


Ответы (1 шт):

Автор решения: Georgy Firsov

Решение для 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 файл со списком экспортируемых функций для того, чтоб имена функций были недекорированными при экспорте на всех платформах.

→ Ссылка