сделать VC ++ .exe в DLL. это возможно? - PullRequest
1 голос
/ 27 марта 2011

У меня есть приложение VC ++ win 32, которое компилируется в EXE. Но теперь я хочу преобразовать его в dll, чтобы можно было загрузить его в другое приложение. Я попытался изменить свойства Visual Studio с .EXE на .DLL, который успешно преобразовал его, но когда я использую GetProcAddress, он всегда возвращает NULL. Я не уверен, что я делаю правильно или неправильно.

В основном это то, чего я хочу достичь:

  1. Я хочу связать проект 1 и проект2
  2. Проект 2 должен иметь возможность вызывать функции проекта1 (который является исполняемым)

EDIT Привет, ребята, спасибо за ваш вклад. Я сказал, что вы, ребята, сказали. даже тогда мой GetProcAddress возвращает ноль. Я делаю что-то не так. Показываю мой код загрузки DLL ниже.

HINSTANCE LoadMe  =  LoadLibrary( _T("D:\\VC++Project\\CVAList\\CVAList\\ExportTest.dll"));

   if (LoadMe != 0)
    printf("LoadMe library loaded!\n");
    else
     printf("LoadMe library failed to load!\n");


   EntryPointfuncPtr LibMainEntryPoint;   
   LibMainEntryPoint = (EntryPointfuncPtr)GetProcAddress(LoadMe,"PrintFloatsVal");
   LibMainEntryPoint (a1 ,a,b,c,d ); // 4 double 

РЕДАКТИРОВАТЬ Код экспорта DLL

#define DllExport   __declspec( dllexport ) 


DllExport  void  PrintFloatsVal ( int amount, double &d1 ,double &d2 , double &d3 ,double &d4)
{
....
..
}

1 Ответ

2 голосов
/ 27 марта 2011

Вам необходимо экспортировать функции, к которым вы хотите получить доступ, с помощью ключевого слова __declspec dllexport.

Так что, если вы добавите в проект константу манифеста 'BUILDING_MY_DLL', файл заголовка, который объявляет нужные вам функцииможет использоваться как в проекте DLL, так и в любом коде, который использует DLL:

#ifdef BUILDING_MY_DLL
#define MY_DLL_EXPORT __declspec dllexport
#else
#define MY_DLL_EXPORT __declspec dllimport
#endif

и украшает функции, которые вы хотите экспортировать:

MY_DLL_EXPORT BOOL Func1(int a);

Если функция, к которой вы хотите получить доступреализован на C ++, он будет оформлен для перегрузки функций и других целей, и к нему лучше всего обращаться напрямую, как и к любой другой функции.Если вы хотите использовать GetProcAddress(), вам лучше использовать C-linkage, окружив функцию extern "C" { ... }.Это сделает экспортированное имя таким же, как имя, используемое в коде.

Ссылка: http://msdn.microsoft.com/en-us/library/a90k134d(v=vs.80).aspx

...