Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Загрузка DLL, написаной на VC++, работает не везде 
V
    Опции темы
Ptica_Oz
  Дата 8.10.2007, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 1.3.2007

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



Один товарищ написал на VC++ DLL с единсвенной экспортируемой функцией, которая печатаем растровые файлы на заданный принтер и накладывает на изображение номер. Моя программа (на Delphi 2006) вызывает эту функцию и происходит собственно печать. Загвоздка вот в чём: на моей машине всё работает нормально, на других машинах, на которых установленны D2006 и VS тоже всё нормально. Как только программа запускается на машине, где нет ни того, ни другог дллька перестаёт загружаться. Загружать пробовала и статически и динамически, всё одно. Чего ей не хватает?  smile 
З.Ы. товарищ, который написал эту длльку, говорит, что он не виноват и я ему верю
PM MAIL   Вверх
Rennigth
Дата 8.10.2007, 10:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Ptica_Oz @  8.10.2007,  10:17 Найти цитируемый пост)
Как только программа запускается на машине, где нет ни того, ни другог дллька перестаёт загружаться

Что значит не загружается? LoadLibrary что возвращает?

Добавлено через 2 минуты и 2 секунды
Покажи как загружаешь. Может твоя программа банально не видит файла библиотеки. Пробовал полный путь до dll указывать, а не относительный?


--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
Ptica_Oz
Дата 8.10.2007, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 1.3.2007

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



загружаю длльку динамически:

объявляю тип:
Код

type
  TImagePrint = function ( szPath , szPrn,
                     szText1, szFont1: string; inSize1: integer;
             szText2, szFont2: string; inSize2 : integer) : integer; stdcall;



вызов функции:
Код

                  { загружаем DLL }
                  DLLInstance := LoadLibrary('ImagePrint.dll');
                  { получаем указатель }
                  @ImagePrint := GetProcAddress(DLLInstance, 'ImagePrint');
                  { вызываем процедуру на выполнение }
                  ExitCode := ImagePrint( s, //путь к файлу
                                  frmForm.Printer,  //имя принтера
                                  frmForm.text, 'CCode39', 10,  //текст, шрифт, размер шрифта
                                  frmForm.text, 'Arial', 8);    // Если метод печати вернул не ноль, то была ошибка{ выгружаем DLL из оперативной памяти }
                  FreeLibrary(DLLInstance);


пробовала указать полный путь, бесполезно, DLLInstance пустой
PM MAIL   Вверх
Rennigth
Дата 8.10.2007, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Попробуй вот такой код:
Код

var
  DLLInstance: DWORD;
  lFileName: string;
begin
  lFileName := ExtractFilePath(ParamStr(0)) + 'ImagePrint.dll';
  if not FileExists(lFileName) then
    raise EExternal.Create('file not found: ' + lFileName);
  { загружаем DLL }
  DLLInstance := LoadLibrary(PChar(lFileName));
  if DLLInstance = 0 then then
    RaiseLastOSError;
  try
    { получаем указатель }
    @ImagePrint := GetProcAddress(DLLInstance, 'ImagePrint');
    { вызываем процедуру на выполнение }
    ExitCode := ImagePrint( s, //путь к файлу
                  frmForm.Printer,  //имя принтера
                  frmForm.text, 'CCode39', 10,  //текст, шрифт, размер шрифта
                  frmForm.text, 'Arial', 8);    // Если метод печати вернул не ноль, то была ошибка{ выгружаем DLL из оперативной памяти }
  finally
    FreeLibrary(DLLInstance);
  end;


Добавлено @ 11:32
Что в результате получится, библиотеку положи вместе с твоим приложением.

Это сообщение отредактировал(а) Rennigth - 8.10.2007, 11:33


--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
Ptica_Oz
Дата 8.10.2007, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 1.3.2007

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



длльку программа находит, но почему-то не загружает :(
PM MAIL   Вверх
Rennigth
Дата 8.10.2007, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Ptica_Oz @  8.10.2007,  12:06 Найти цитируемый пост)
длльку программа находит, но почему-то не загружает :( 


после вызова LoadLibrary чему равен о значение DLLInstance? 
Если 0 то что рейзит RaiseLastOSError?


--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
Ptica_Oz
Дата 8.10.2007, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 1.3.2007

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



на опытной машине (без делфей и VC++) проблему решили установкой visual c++ 8.0 runtime libraries, надеюсь, что этим дело ограниыется
PM MAIL   Вверх
Alix
Дата 8.10.2007, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


L45
**


Профиль
Группа: Участник
Сообщений: 581
Регистрация: 4.5.2005
Где: Pskov/Spb

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



плохо dll сделали значит...


--------------------
Знание только тогда знание, когда оно приобретено усилиями своей мысли, а не памятью (с) Л. Толстой
High tech. Low live. (с) Gardner Dozois
PM MAIL ICQ Skype   Вверх
Alexeis
Дата 8.10.2007, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Цитата(Alix @  8.10.2007,  14:11 Найти цитируемый пост)
плохо dll сделали значит... 

  Не плохо, а с подключением Run Time библиотек. Для проектов с несколькими исполняемыми модулями это оправдано, так как экономит место на диске. 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Alix
Дата 8.10.2007, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


L45
**


Профиль
Группа: Участник
Сообщений: 581
Регистрация: 4.5.2005
Где: Pskov/Spb

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



Цитата(Alexeis @  8.10.2007,  15:19 Найти цитируемый пост)
Не плохо, а с подключением Run Time библиотек. Для проектов с несколькими исполняемыми модулями это оправдано, так как экономит место на диске.  

конечно, но из описания я понимаю, что это не тот случай



--------------------
Знание только тогда знание, когда оно приобретено усилиями своей мысли, а не памятью (с) Л. Толстой
High tech. Low live. (с) Gardner Dozois
PM MAIL ICQ Skype   Вверх
Ptica_Oz
Дата 10.10.2007, 08:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 1.3.2007

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



за проблемой связаной с загрузкой длльки на другой машине не заметила ещё одного бага: на моей машине дллька подгружается и выполняется и потом выгружается (см. код выше), но вот потом при попытки создать экземпляр класса TClientDataSet вываливается ошибка обращения к нулевому адресу. Если длльку подгружать, но функцию не вызывать, то всё работает...
В результате пршли к решению переписать эту функцию на делфях.
Это уже вторая моя попытка подключить длльку, написаную на VC++, к делфям и опять неудачная (о первой попытке говориться тут). Может у кого есть опыт таких махинаций и может дать общие рекомендации по написанию длльек на VC++ так, что бы они без проблем цеплялись к делфям?
PM MAIL   Вверх
Alexeis
Дата 10.10.2007, 08:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Ptica_Oz, Dll ка существует в адресном пространстве программы, так что любые ошибки в ней могут сказываться на работе всего приложения. Думаю ошибка как раз в Dll.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Rennigth
Дата 10.10.2007, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Ptica_Oz @  10.10.2007,  08:45 Найти цитируемый пост)
Может у кого есть опыт таких махинаций и может дать общие рекомендации по написанию длльек на VC++ так, что бы они без проблем цеплялись к делфям? 

Никаких здесь нет рекомендаций. Если криво dll написана то здесь уже ничего не поделаешь. Она не будет работать и из любого приложения, не зависимо на делфях она написана или просто из rundll вызывается процедура... 
Цитата(Ptica_Oz @  8.10.2007,  10:17 Найти цитируемый пост)
З.Ы. товарищ, который написал эту длльку, говорит, что он не виноват и я ему верю 

имхо не верь smile пусть он сам через rundll32 попробует вызвать свою функцию на пустой машине. smile



--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
Alexeis
Дата 10.10.2007, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Цитата(Rennigth @  10.10.2007,  10:48 Найти цитируемый пост)
Она не будет работать и из любого приложения, не зависимо на делфях она написана или просто из rundll вызывается процедура... 

  На самом деле на другом может и сработать, все зависит от случая и от различных факторов. Некоторые ошибки часто остаются незамеченными, так как не вызывают вылет тестового приложения. Т.е. может происходить запись по чужому адресу, но там мог оказаться баласт или что-то не очень важное. У другой программы, на том же месте может оказаться что-то жизненно важное или тот участок памяти может быть вообще не выделенным, потому обращение и вызывает AV.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Ptica_Oz
Дата 12.10.2007, 07:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 1.3.2007

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



переписали функцию, теперь она оформлена в ехе файл, пошла ставить на пустые машины, не получилось. visual c++ 8.0 runtime libraries, которую я поставила в первый раз, не давал нужного результата. сисадмин раздобыл другую, я её поставила и всё заработало. Вывод: корявая была visual c++ 8.0 runtime libraries. вопрос счетаю закрытым.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




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


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

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