Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 2 568

/ вопрос открыт /

Доброго времени суток, уважаемые эксперты!

Нужно в dll организовать загрузку данных в программу
Есть модуль: (1)
создаю dll: (2)
далее в основной проге пишу: (3)

после использования FreeLibrary(Lib) приводит к ошибке.

подскажите как можно реализовать загрузку данных с использованием dll.

Приложение:
  1. (1)
  2.  
  3. unit UnitDoc;
  4. interface
  5. uses classes;
  6. Type
  7. TDocItem = class
  8. FCpt: String;
  9. constructor create(S: String);
  10. end;
  11.  
  12. TDocument = class
  13. private
  14. public
  15. FList: TList;
  16. procedure Add(Item: TDocItem);
  17. constructor Create;
  18. destructor Destroy; override;
  19. end;
  20.  
  21. implementation
  22.  
  23. { TDocument }
  24.  
  25. procedure TDocument.Add(Item: TDocItem);
  26. begin
  27. FList.Add(Item)
  28. end;
  29.  
  30. constructor TDocument.create;
  31. begin
  32. FList:=TList.Create;
  33. end;
  34.  
  35. destructor TDocument.destroy;
  36. var i: Integer;
  37. begin
  38. For i:=0 to FList.Count-1 do TDocItem(FList[i]).Free;
  39. FList.Free;
  40. inherited;
  41. end;
  42.  
  43. { TDocItem }
  44.  
  45. constructor TDocItem.create(S: String);
  46. begin
  47. FCpt:=S
  48. end;
  49.  
  50. end.
  51.  
  52. (2)
  53.  
  54. library TestDll2;
  55. uses SysUtils, Classes, UnitDoc, DBTables;
  56. {$R *.res}
  57. procedure Load(Doc: TDocument); export;
  58. var i: integer; T: TTable;
  59. begin
  60. T:=TTable.Create(nil);
  61. try
  62. T.DatabaseName := 'DBDEMOS';
  63. T.IndexFieldNames := 'Company';
  64. T.TableName := 'CUSTOMER.DB';
  65. T.Open;
  66. While not T.Eof do begin
  67. Doc.Add(TDocItem.Create(T.Fieldbyname('Company').AsString));
  68. T.Next
  69. end;
  70. finally T.Free end;
  71. end;
  72.  
  73. exports Load;
  74.  
  75. begin
  76. end.
  77.  
  78. (3)
  79.  
  80. uses UnitDoc;
  81.  
  82. Type
  83. TProcL = procedure(D: TDocument);
  84.  
  85. procedure TForm1.Button2Click(Sender: TObject);
  86. var i, Lib: Integer; S: String; PLoad: TProcL; Doc: TDocument;
  87. begin
  88. Doc:=TDocument.Create;
  89. Lib:=LoadLibrary('TestDLL2.dll'); if Lib=0 then halt;
  90. @PLoad:=GetProcAddress(Lib,'Load'); if @PLoad=nil then Halt;
  91. PLoad(Doc);
  92. Button2.Caption:=IntToStr(Doc.FList.Count);
  93. FreeLibrary(Lib);
  94. For i:=0 to Doc.FList.Count-1 do
  95. ListBox1.Items.add(TDocItem(Doc.FList[i]).FCpt);
  96. Doc.Free;
  97. end;


Light007 Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Light007 (статус: Посетитель)
Вопрос отправлен: 26 марта 2009, 18:26
Состояние вопроса: открыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 1; последнее сообщение — 26 марта 2009, 18:49; участников в обсуждении: 1.
Вадим К

Вадим К (статус: Академик), 26 марта 2009, 18:49 [#1]:

ещё раз повторяю, где ShareMem?
Остальные ошибки я просто молчу. Крайне не рекомендую передавать класс через границу длл/приложение.
О бде я просто молчу.
Галочка "подтверждения прочтения" - вселенское зло.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:59
Выполнено за 0.02 сек.