Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ленивая загрузки dll 
:(
    Опции темы
kostyaizznu
Дата 4.6.2010, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 88
Регистрация: 30.10.2008
Где: Запорожье

Репутация: нет
Всего: нет



Доброго всем времени суток. Проблема состоит в том, чтобы ленивым образом загрузить библиотеку с функциями 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 ***

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


Это сообщение отредактировал(а) kostyaizznu - 4.6.2010, 13:25
PM MAIL ICQ Skype   Вверх
GremlinProg
Дата 4.6.2010, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата

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);



--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
kostyaizznu
Дата 4.6.2010, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 88
Регистрация: 30.10.2008
Где: Запорожье

Репутация: нет
Всего: нет



А как избавиться от ошибок ?

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()
PM MAIL ICQ Skype   Вверх
GremlinProg
Дата 4.6.2010, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(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 секунды
а, хотя нет, тут что-то другое,
вобщем это тема другого подфорума, перенести?


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
kostyaizznu
Дата 4.6.2010, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 88
Регистрация: 30.10.2008
Где: Запорожье

Репутация: нет
Всего: нет



Ок, перенесите)
PM MAIL ICQ Skype   Вверх
586
Дата 4.6.2010, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 39
Всего: 146



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

Должна быть большая буква "C".
PM   Вверх
GremlinProg
Дата 4.6.2010, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



лучше сделаем зеркало, вопрос пересекает 2 подфорума


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
maxim1000
Дата 4.6.2010, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 2
Всего: 110



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

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

#define MYAPI



--------------------
qqq
PM WWW   Вверх
xvr
Дата 4.6.2010, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



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

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

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0532 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.