Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.04.2011, 00:00   #1
Vahmur
 
Регистрация: 11.09.2008
Сообщений: 5
По умолчанию Перенос библиотеки dll на Win 7

Здравствуйте. У меня маленькая есть функция для копирования файлов. Использую её для вызова из другого языка (MQL4), т.к. сам он умеет работать с файлами только в папке, где установлен. Под Win XP всё работало (компилировал в Delphi 7), но когда перешёл на Win 7, работать перестало. Мне посоветовали откомпилировать библиотеку с помощью Delphi 2009. Компиляция проходит, но ничего не работает. Подскажите в чём проблема? Вот код:

Код:
function FCopy(fn1,fn2: PChar) : integer;  stdcall;
  var fnam1,fnam2 : String;
  var f1,f2       : file of byte;
  var g           : byte;
  var k           : integer;
begin
  fnam1:=StrPas(fn1);
  fnam2:=StrPas(fn2);

  if FileExists(fnam1) then
     begin
     AssignFile (f1, fnam1);
     Reset(f1);
     AssignFile (f2, fnam2);
     Rewrite(f2); 
     while not(Eof(f1)) do
        begin
        Read(f1,g);
        Write(f2,g);
        end;
     CloseFile(f1);
     CloseFile(f2);
     k:=1
     end else k:=-1;

  Result:=k;

end;
Vahmur вне форума Ответить с цитированием
Старый 12.04.2011, 00:29   #2
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> только в папке, где установлен. Под Win XP всё работало (компилировал в Delphi 7), но когда перешёл на Win 7, работать перестало

если этот MQL4 установлен в Program Files, то, скорей всего, просто нет прав на открытие файлов в этом каталоге.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 12.04.2011, 21:13   #3
Vahmur
 
Регистрация: 11.09.2008
Сообщений: 5
По умолчанию

Нет, MQL4 этоя язык торгового терминала, установлен в папке D:\Metatrader\
Vahmur вне форума Ответить с цитированием
Старый 12.04.2011, 22:22   #4
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
Сообщение от Vahmur Посмотреть сообщение
работать перестало
Замечательная формулировка проблемы, что и говорить.

Спасибо, что видите в нас яркие телепатические способности.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 12.04.2011, 22:27   #5
MotoArhangel
Пользователь
 
Регистрация: 25.02.2011
Сообщений: 51
По умолчанию

Vahmur
Да уж, проект хоть с правами админа побывал запустить? Это вам не XP)
У меня телепатические способности на 99% развиты=)
MotoArhangel вне форума Ответить с цитированием
Старый 13.04.2011, 11:11   #6
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,762
По умолчанию

А зачем в библиотеке не использовать простую функцию CopyFile?
Типо:
Код:
function FCopy(fn1,fn2: string) : integer;  stdcall;
begin
  result := CopyFile (Pchar (fn1), PChar (fn2), false);
end;

Последний раз редактировалось FaTaL; 13.04.2011 в 11:59.
FaTaL вне форума Ответить с цитированием
Старый 13.04.2011, 12:32   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
но когда перешёл на Win 7, работать перестало.
может быть нужно эту программу запускать от имени администратора? есть в семерке такой прикол, я так с EQL возился на кассовых аппаратах, в результате от Севена отказались.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 13.04.2011, 22:24   #8
Vahmur
 
Регистрация: 11.09.2008
Сообщений: 5
По умолчанию

Попобовал немного изменить код, чтобы узнать получает ли функция хоть какие-либо значения и запускается ли вообще
Код:
function FCopy(fn1,fn2: PChar) : integer;  stdcall;
  var fnam1,fnam2 : String;
  var f3          : System.Text;

begin
  fnam1:=StrPas(fn1);
  fnam2:=StrPas(fn2);

AssignFile (f3, '123.txt');
Rewrite(f3);
Writeln(f3,fnam1);
Writeln(f3,fn1);
Writeln(f3,fnam2);
Writeln(f3,fn2);
CloseFile(f3);

  Result:=20;
end;
Вызывал функцию командой: int copyini = FCopy("D:\metatrader\main\experts\l ibraries\optimum.ex4","C:\optimum.e x4");
в результирующий файл '123.txt' были записаны следующие строки:

????????????????????????????????4?? ????????????????????????????????U?? ??????????????????????????????????? ?????????JK???y
????????????????????????????????4?? ????????????????????????????????U?? ??????????????????????????????????? ?????????JK???y
?????????????????????????????????U? ??????????????????????????????????? ??????????JK???y
?????????????????????????????????U? ??????????????????????????????????? ??????????JK???y



Затем изменил тип входящих переменных с PChar на ShortString
Код:
function FCopy(fn1,fn2: ShortString) : integer;  stdcall;
  var fnam1,fnam2 : String;
  var f3          : System.Text;

begin
  fnam1:=StrPas(fn1);
  fnam2:=StrPas(fn2);

AssignFile (f3, '123.txt');
Rewrite(f3);
Writeln(f3,fnam1);
Writeln(f3,fn1);
Writeln(f3,fnam2);
Writeln(f3,fn2);
CloseFile(f3);

  Result:=20;
end;
в результирующий файл '123.txt' были записаны следующие строки:
:\webshare\WWWROOT\metatrader\main\ experts\libraries\optimum.ex4 SSC
:\webshare\WWWROOT\metatrader\main\ experts\libraries\optimum.ex4 SSC
:\optimum.ex4 eрезультат= M4|l?~ы†sјјГн?ЦЕm4Ђ·м?р§ЖK7‰н5|
d*< ь
:\optimum.ex4 eрезультат= M4|l?~ы†sјјГн?ЦЕm4Ђ·м?р§ЖK7‰н5|
d*< ь


Цитата:
Сообщение от FaTaL Посмотреть сообщение
А зачем в библиотеке не использовать простую функцию CopyFile?
Типо:
Код:
function FCopy(fn1,fn2: string) : integer;  stdcall;
begin
  result := CopyFile (Pchar (fn1), PChar (fn2), false);
end;
Если тип входящих переменных указать string, то функция вообще не запускается, а вызывающая программа виснет. Я так понимаю, что возникает проблема с кодировкой. Помогите решить.

Последний раз редактировалось Vahmur; 13.04.2011 в 22:40.
Vahmur вне форума Ответить с цитированием
Старый 13.04.2011, 23:44   #9
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

У тебя была проблема - перенос программы под D7. Вот её и решай.

Ты же взял и ухудшил эту проблему введением новой - переход на D2009 (а значит - на Unicode).

И хотя само по себе действие правильное (переход на D2009), но делать его надо отдельно. Ты сначала проект в D7 поправь, чтобы он на Win7 работал, а уж потом делай переход на D2009.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
DLL библиотеки Михаил Юрьевич Общие вопросы Delphi 8 11.10.2010 20:55
DLL БИБЛИОТЕКИ Delphi J.Bond Помощь студентам 18 24.05.2010 21:10
загрузка библиотеки DLL s2dentishe Помощь студентам 7 10.01.2010 17:48
Библиотеки Dll ivanesky Общие вопросы Delphi 9 10.03.2008 10:42
DLL библиотеки Altera Помощь студентам 2 06.02.2008 06:13