Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Ленивая загрузки dll


Автор: kostyaizznu 4.6.2010, 13:19
Доброго всем времени суток. Проблема состоит в том, чтобы ленивым образом загрузить библиотеку с функциями CreateMatrix, DeleteMatrix ... для начала. 

Вот мои наброски:

mydll.h

Код

#ifdef __cplusplus
    #define MYAPI extern "c"
#else 
    #define extern
#endif  c
#define  MYCALLCONV __stdcall

  MYAPI TMatrix * MYACALLCONV CreateMatrix(int n, int m);
  MYAPI void MYCALLCONV DeleteMAtrix(TMatrix *m);
  MYAPI void MYCALLCONV TransposeMatrix(TMatrix *);
  MYAPI void MYCALLCONV PrintMatrix(TMatrix *);




mydll.cpp

Код

#include <stdio.h>
#include <stdlib.h>
#include "mydll.h"
#define EXPORT __delspec(dllexport)

    EXPORT TMatrix * MYCALLCONV CreateMatrix(int n, int m)
     {
      Tmatrix *m;
       m=(TMatrix *) malloc (sizeof(TMatrix));
       m->n=n;
       m->m=m;
       m->p=(double *) malloc (m*n*sizeof(double));
          return(m);
     }

    EXPORT void MYCALL CONV DeleteMatrix(TMatrix *m)
     {
      free(m->p);
      free(m);
     } 


mydll_lazy.h

Код

typedef struct
 {
  int n, m;
  double *p;
 }TMatrix;

  extern TMatrix*(*MYCALLCONV CreateMatrix)(int n, int m);
  extern void (*MYCALLCONV DeleteMatrix)(TMatrix *m);



Lazy.cpp

Код

#include <windows.h>
#include <stdio.h>
#include "mydll_lazy.h"

  static HANDLE hLib=NULL;
   
   static TMatrix * MYCALLCONV CreateMatrixStub(int n, int m);
   TMatrix * (*MYCALLCONV CreateMatrix)(int n, int m)=CreateMatrixStub;

  static Tmatrix * MYCALLCONV CreateMatrixStub(int n, int m)
   {
    if (hLib==NULL)    
    { hLib=LoadLibrary("mydll.dll");
       
       if (hLib==NULL) 
       { printf("Can't open 'mydll.dll' \");
         getch();
     exit(1);
       }
     }
    if (CreateMatrix==CreateMatrixStub) 
     { CreateMatrix = (TMatrix *(*MYCALLCONV)(int n, int m))
       GetProcAddress(hLib,"CreateMatrix");
        if(CreateMatrix==NULL)
         { printf("Can't find CreateMatrix \n");
           getch();
       exit(1);
     }
      }
     return CreateMatrix(n,m);
    }


main.cpp

Код

#include <conio.h>
#include <stdio.h>
#include "mydll_lazy.h"

 int main(void)
 {
  TMatrix *m;
  m = CreateMatrix(10,10);
  DeleteMatrix(m);
  return 0;
  getch()
 }


при компиляции bcc32 -tWD -tWM mydll.cpp :

D:\Мои документы\Study\6Семестр\SysProg\individualka>bcc32 -tWD -tWM mydll.cpp
Borland C++ 5.6 for Win32 Copyright © 1993, 2002 Borland
mydll.cpp:
Error E2059 mydll.h 8: Unknown language, must be C or C++
Error E2141 mydll.h 8: Declaration syntax error
Error E2059 mydll.h 9: Unknown language, must be C or C++
Error E2451 mydll.h 9: Undefined symbol 'TMatrix'
Error E2059 mydll.h 10: Unknown language, must be C or C++
Error E2451 mydll.h 10: Undefined symbol 'TMatrix'
Error E2059 mydll.h 11: Unknown language, must be C or C++
Error E2451 mydll.h 11: Undefined symbol 'TMatrix'
Warning W8054 mydll.cpp 6: Style of function definition is now obsolete
Error E2258 mydll.cpp 6: Declaration was expected
Warning W8057 mydll.cpp 20: Parameter 'dllexport' is never used in function __de
lspec()
*** 9 errors in Compile ***


при компиляции  bcc32 -tWD -tWM lazy.cpp высвечивает:

D:\Мои документы\Study\6Семестр\SysProg\individualka\lazy>bcc32 -tWD -tWM lazy.cpp

Borland C++ 5.6 for Win32 Copyright © 1993, 2002 Borland
lazy.cpp:
Error E2293 mydll_lazy.h 7: ) expected
Error E2293 mydll_lazy.h 8: ) expected
Error E2141 lazy.cpp 7: Declaration syntax error
Error E2293 lazy.cpp 8: ) expected
Error E2141 lazy.cpp 10: Declaration syntax error
Error E2380 lazy.cpp 16: Unterminated string or character constant
*** 6 errors in Compile ***

Все ли я правильно делаю? И в чем ошибки?

Автор: GremlinProg 4.6.2010, 13:26
Цитата

extern TMatrix*(MYCALLCONV*CreateMatrix)(int n, int m);
extern void (MYCALLCONV*DeleteMatrix)(TMatrix *m);


Добавлено через 6 минут и 45 секунд
фу ты, не обратил внимание на extern, по инерции подумал typedef :)
Цитата

extern TMatrix* MYCALLCONV CreateMatrix(int n, int m);
extern void  MYCALLCONV DeleteMatrix(TMatrix *m);

Автор: kostyaizznu 4.6.2010, 13:53
А как избавиться от ошибок ?

Error E2059 mydll.h 8: Unknown language, must be C or C++
Error E2141 mydll.h 8: Declaration syntax error
Error E2059 mydll.h 9: Unknown language, must be C or C++
Error E2451 mydll.h 9: Undefined symbol 'TMatrix'
Error E2059 mydll.h 10: Unknown language, must be C or C++
Error E2451 mydll.h 10: Undefined symbol 'TMatrix'
Error E2059 mydll.h 11: Unknown language, must be C or C++
Error E2451 mydll.h 11: Undefined symbol 'TMatrix'
Warning W8054 mydll.cpp 6: Style of function definition is now obsolete
Error E2258 mydll.cpp 6: Declaration was expected
Warning W8057 mydll.cpp 20: Parameter 'dllexport' is never used in function __de
lspec()

Автор: GremlinProg 4.6.2010, 14:02
Цитата(kostyaizznu @  4.6.2010,  15:19 Найти цитируемый пост)
EXPORT TMatrix * MYCALLCONV CreateMatrix(int n, int m)

так нравятся звездочки :)
есть же синтаксис: http://www.google.ru/search?q=c%2B%2B+function+syntax

Добавлено через 1 минуту и 53 секунды
а, хотя нет, тут что-то другое,
вобщем это тема другого подфорума, перенести?

Автор: kostyaizznu 4.6.2010, 14:08
Ок, перенесите)

Автор: 586 4.6.2010, 14:12
Цитата(kostyaizznu @  4.6.2010,  14:19 Найти цитируемый пост)
#define MYAPI extern "c"

Должна быть большая буква "C".

Автор: GremlinProg 4.6.2010, 14:13
лучше сделаем зеркало, вопрос пересекает 2 подфорума

Автор: maxim1000 4.6.2010, 16:23
Цитата(kostyaizznu @  4.6.2010,  13:19 Найти цитируемый пост)
    #define extern

вот это не очень хорошо
наверное, имелось в виду
Код

#define MYAPI

Автор: xvr 4.6.2010, 17:06
Неправильный порядок include'ов - на момент включения mydll.h неизвестно, что такое TMatrix (а оно там используется)

PS. Это не 'Ленивая загрузка', это 'Динамическая загрузка'

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)