2 #define MYCUSTOMDLL_API __declspec(dllexport)
3 #else
4 #define MYCUSTOMDLL_API __declspec(dllimport)
5 #endif
6
7 typedef struct _CAR
8 {
9 char* make;
10 char* color;
11 }CAR;
12
13 typedef struct _CAR2
14 {
15 CAR theCar;
16 char* petName;
17 }CAR2;
18
19 extern "C" MYCUSTOMDLL_API int AddNumbers(int x, int y);
20 extern "C" MYCUSTOMDLL_API int AddArray(int x[], int size);
21 extern "C" MYCUSTOMDLL_API void DisplayBetterCar(CAR2* theCar);
22 extern "C" MYCUSTOMDLL_API void GiveMeThreeBasicCars(CAR** theCars);
23
24 class MYCUSTOMDLL_API CMiniVan
25 {
26 public:
27 CMiniVan()
28 {
29 m_numbKids = 52;
30 }
31 int DisplayNumberOfKids()
32 {
33 return m_numbKids;
34 }
35 private:
36 int m_numbKids;
37 };
38
39 extern "C" MYCUSTOMDLL_API CMiniVan* CreateMiniVan();
40 extern "C" MYCUSTOMDLL_API void DeleteMiniVan(CMiniVan* obj);
Implementation:
2 #include <windows.h>
3 // For CoTaskMemAlloc().
4 #include <objbase.h>
5
6 extern "C" MYCUSTOMDLL_API int AddNumbers(int x, int y)
7 {
8 return x+y;
9 }
10
11 extern "C" MYCUSTOMDLL_API int AddArray(int x[], int size)
12 {
13 int sum = 0;
14 for(int i=0; i<size; i++)
15 {
16 sum += x[i];
17 }
18 return sum;
19 }
20
21 extern "C" MYCUSTOMDLL_API void DisplayBetterCar(CAR2* theCar)
22 {
23 MessageBoxA(NULL, theCar->theCar.color, "Car Color", MB_OK);
24 MessageBoxA(NULL, theCar->theCar.make, "Car Make", MB_OK);
25 MessageBoxA(NULL, theCar->petName, "Car Pet Name", MB_OK);
26 }
27
28 extern "C" MYCUSTOMDLL_API void GiveMeThreeBasicCars(CAR** theCars)
29 {
30 int numOfCars = 3;
31 *theCars = (CAR*)CoTaskMemAlloc(numOfCars * sizeof(CAR));
32
33 char* carMakes[3] = {"BMW", "Ford", "Viper"};
34 char* carColors[3] = {"Green", "Pink", "Red"};
35
36 CAR* pCurCar = *theCars;
37 for(int i=0; i<numOfCars; i++, pCurCar++)
38 {
39 pCurCar->color = carColors[i];
40 pCurCar->make = carMakes[i];
41 }
42 }
43
44 extern "C" MYCUSTOMDLL_API CMiniVan* CreateMiniVan()
45 {
46 return new CMiniVan();
47 }
48
49 extern "C" MYCUSTOMDLL_API void DeleteMiniVan(CMiniVan* obj)
50 {
51 delete obj;
52 }
53
54 BOOL APIENTRY DllMain( HANDLE hModule,
55 DWORD ul_reason_for_call, LPVOID lpReserved)
56 {
57 switch (ul_reason_for_call)
58 {
59 case DLL_PROCESS_ATTACH:
60 MessageBoxA(NULL, "Dll is loading!", "DllMain() says...", MB_OK);
61 break;
62 case DLL_PROCESS_DETACH:
63 MessageBoxA(NULL, "Dll is UNloading!", "DllMain() says...", MB_OK);
64 break;
65 }
66 return TRUE;
67 }


2 #include <iostream>
3 #include "MyCustomDLL.h"
4 using namespace std;
5
6 int main(int argc, char* argv[])
7 {
8 typedef int (*PFNADDNUMBERS) (int, int);
9 PFNADDNUMBERS pfnAddMethod;
10
11 typedef int (*PFNDISPLAYBETTERCAR) (CAR2*);
12 PFNDISPLAYBETTERCAR pfnDisplayBetterCar;
13
14 HINSTANCE dllHandle = NULL;
15 dllHandle = LoadLibraryA("MyCustomDLL.dll");
16
17 if(dllHandle != NULL)
18 {
19 pfnAddMethod = (PFNADDNUMBERS)GetProcAddress(dllHandle, "AddNumbers");
20 if(pfnAddMethod != NULL)
21 {
22 int result = pfnAddMethod(100, 100);
23 cout << "100 + 100 is " << result << endl;
24 }
25
26 CAR2 myCar;
27 myCar.petName = "dog";
28 myCar.theCar.make = "make";
29 myCar.theCar.color = "Red";
30
31 pfnDisplayBetterCar = (PFNDISPLAYBETTERCAR)GetProcAddress(dllHandle, "DisplayBetterCar");
32 if(pfnDisplayBetterCar != NULL)
33 {
34 pfnDisplayBetterCar(&myCar);
35 }
36
37 FreeLibrary(dllHandle);
38 }
39
40 cin.get();
41
42 return 0;
43 }