2016-10-28 12 views
0

Я хочу использовать dll-файл в своем C-коде, но очень смущен синтаксисом.Использовать динамическую библиотеку dll в программе C

My Story: Я сделал простую функцию в Matlab (f (x1, x2) = x1 * x2), с помощью «Matlab Coder» я перевел его в C-Code и создал exe, я мог запускать его из терминал с аргументами. Теперь я сгенерировал dll вместо exe и хочу использовать dll.

С тех пор я не смог сделать объяснения Кодекса, я googled, работаю для меня. Я смотрю синтаксис в http://en.cppreference.com/w/, но, к моему удивлению, не было даже записи, например. GetProcAddress или LoadLirbary.

Здесь C-код, в котором я хотел бы использовать библиотеку DLL:

#include <stdio.h> 
#include <stdlib.h> 

/* 
* In my dream I would load the dll function here 
* with something like Load(mytimes4.dll) 
*/ 

int main(int argc, char *argv[]) { 

double x1,x2,myresult; 
//Load Arguments from Terminal 
sscanf(argv[1], "%lf", &x1); 
sscanf(argv[2], "%lf", &x2); 

// Use and print the function from mytimes4.dll 
myresult = mytimes4(x1,x2); 
printf("%3.2f\n",myresult); 

return 0; 
} 

После создания библиотеки DLL, Matlab дал мне следующую папку: "dll-folder" produced by Matlab

Может кто-то дать мне самый простой, но полный код, который будет работать с моим примером? Какие файлы необходимы (возможно, .def или .exp)? Также для пояснений строк, связанных с использованием dll, я был бы признателен. Или, если нет, возможно, у вас есть некоторые базовые знания, которые делают сложный синтаксис разумным. Спасибо заранее!

Системная информация: Windows 7 Pro 64, Matlab 64 2016b, gcc cygwin 64, eclipse ide.

+0

Я не удивлен, что cppreference не имеет записей для OpenLibrary и GetProcAddress - эти функции являются частью Windows API (не входит в C++ стандарт). Для описания OpenLibrary см. Https://msdn.microsoft.com/en-us/library/windows/desktop/ms684175(v=vs.85).aspx и, например, использование см. На странице https://msdn.microsoft.com. /en-us/library/windows/desktop/ms686944(v=vs.85).aspx для примера использования OpenLibrary и GetProcAddress. – thurizas

+0

Вы можете проверить решение, которое я предложил этому сообщению [Ссылка на DLL в Pelles C] (http://stackoverflow.com/questions/40282524/link-to-a-dll-in-pelles-c). –

+0

Каково содержание 'mytimes4.h' и' mytimes4.def'? –

ответ

0

Со ссылкой thurizas Я мог бы решить свою проблему. https://msdn.microsoft.com/en-us/library/windows/desktop/ms686944(v=vs.85).aspx Я скопировал код сбоку. Ниже вы можете увидеть код с моими дополнительными комментариями и, с моей точки зрения, более четко называть. Таким образом, это, вероятно, легче использовать для новичков, как и я.

#include <stdio.h> 
#include <stdlib.h> 
#include <windows.h> 

/*Declaration of the function,contained in dll, as pointer with the arbitrary pointer name 
"*MYFUNCTIONPOINTER" (not sure if it has to be in big letters). 
In my case the function means simply f(x1,x2) = x1*x2 and is thus as double declared*/ 
typedef double (*MYFUNCTIONPOINTER)(double, double); 

int main() { 

    HINSTANCE hinstLib; 
    //"myfunction" is the arbitrary name the function will be called later 
    MYFUNCTIONPOINTER myfunction; 
    BOOL fFreeResult, fRunTimeLinkSuccess = FALSE; 

    //Tell the dll file 
    hinstLib = LoadLibrary(TEXT("mypersonal.dll")); 

    if (hinstLib != NULL) 
     { 
     /* At this line "myfunction" gets its definition from "MYFUNCTIONPOINTER" 
     and can be used as any other function.The relevant function in the dll has 
     to be told here.*/ 
     myfunction = (MYFUNCTIONPOINTER) GetProcAddress(hinstLib, "mydllfunction"); 

      // If the function address is valid, call the function. 
      if (NULL != myfunction) 
      { 
       fRunTimeLinkSuccess = TRUE; 

      // The function can be used. 
      double myoutput; 
      myoutput = myfunction(5,7); 
      printf("%f\n",myoutput); 
      getchar(); 
      } 
      // Free the DLL module. 

      fFreeResult = FreeLibrary(hinstLib); 
     } 

     // If unable to call the DLL function, use an alternative. 
     if (! fRunTimeLinkSuccess) 
      printf("Message printed from executable\n"); 

    return 0; 
}