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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.12.2009, 18:29   #1
Gott
 
Регистрация: 29.04.2009
Сообщений: 4
Восклицание Проблемы с функцией и DLL

Всем привет. Прошу помощи. Delphi. Изложу суть проблемы.
Имеется приложение, а так - же имеется dll файл с таким исходным кодом:

PHP код:
library functions;

uses
  Windows
SysUtilsClassesDialogs;

{
$R *.res}

function 
GetCPUSpeeddoublestdcall;
const
  
DelayTime 500;
var
  
TimerHiTimerLoDWORD;
  
PriorityClassPriorityinteger;
begin
  PriorityClass 
:= GetPriorityClass(GetCurrentProcess);
  
Priority := GetThreadPriority(GetCurrentThread);
  
SetPriorityClass(GetCurrentProcessREALTIME_PRIORITY_CLASS);
  
SetThreadPriority(GetCurrentThreadTHREAD_PRIORITY_TIME_CRITICAL);
  
Sleep(10);
  
asm
    dw 310Fh 
// rdtsc
    
mov TimerLoeax
    mov TimerHi
edx
  end
;
  
Sleep(DelayTime);
  
asm
    dw 310Fh 
// rdtsc
    
sub eaxTimerLo
    sbb edx
TimerHi
    mov TimerLo
eax
    mov TimerHi
edx
  end
;
  
SetThreadPriority(GetCurrentThreadPriority);
  
SetPriorityClass(GetCurrentProcessPriorityClass);
  
Result := TimerLo / (1000.0 DelayTime);
end;

exports GetCPUSpeed;

begin
end

Собственно всего - то навсего хочу вызвать и использовать данную функцию в своем приложении, но при компиляции выдает ошибку
PHP код:
  [ErrorLoading.pas(24): Function needs result type
  
[ErrorLoading.pas(11): Unsatisfied forward or external declaration'TLoadingForm.GetCPUSpeed'
  
[Fatal ErrorSelectionComitee.dpr(5): Could not compile used unit 'Loading.pas' 
Ниже привожу код приложения

PHP код:
unit Loading;

interface

uses
  Windows
MessagesSysUtilsVariantsClassesGraphicsControlsForms,
  
Dialogsinifiles;

type
  TLoadingForm 
= class(TForm)
  function 
GetCPUSpeeddoublestdcall;
  
procedure FormCreate(SenderTObject);
  private
    { Private 
declarations }
  public
    { Public 
declarations }
  
end;

var
  
LoadingFormTLoadingForm;
  
IniTinifile;

implementation

function GetCPUSpeedexternal 'functions.DLL' name 'GetCPUSpeed';

{
$R *.dfm}

procedure TLoadingForm.FormCreate(SenderTObject);
var
  
first_teststring;
begin
  
if Not FileExists('settings.ini'then
    begin
      MessageBox
(0'ERROR!.''WARNING'mb_IconWarning mb_OK mb_TaskModal);
      
Halt;
    
end;

    
Ini:=TiniFile.Create(extractfilepath(Application.ExeName)+'settings.ini');
    
first_test:=Ini.ReadString('main','first_test','false');
    
ShowMessage(first_test);
    
Ini.Free;

    if 
first_test 'false' then
      begin
        ShowMessage
(Format('CPU speed: %f MHz', [GetCPUSpeed]));
      
end;

end;

end
Полагаю причина во мне. Я даже более чем уверен что где - то что - то не так объявил, но не могу понять в чем ошибка так как новичек. Понимаю что говорит мне делфи, но не могу понять что нужно сделать D:
Проверил только что с другой функцией, такая - же ошибка

Последний раз редактировалось Gott; 13.12.2009 в 19:55. Причина: Дополнено
Gott вне форума Ответить с цитированием
Старый 13.12.2009, 19:23   #2
Nowar
Пользователь
 
Регистрация: 13.12.2009
Сообщений: 23
По умолчанию

Написано
function GetCPUSpeed; external 'functions.DLL' name 'GetCPUSpeed';
А что возвращает функция? Нужно двоеточие и тип.
Nowar вне форума Ответить с цитированием
Старый 13.12.2009, 19:43   #3
Gott
 
Регистрация: 29.04.2009
Сообщений: 4
По умолчанию

Тогда он ругается на эту строчку
Код:
type
  function GetCPUSpeed: double; stdcall;
Ошибка:
Код:
Build
  [Error] Loading.pas(11): Unsatisfied forward or external declaration: 'TLoadingForm.GetCPUSpeed'
Изменил так:
Код:
function GetCPUSpeed: Double; external 'functions.DLL' name 'GetCPUSpeed';
* красным жирным выделил что изменил конкретно

Функция возвращает скорость CPU, листинг выше, самый первый код.

Последний раз редактировалось Gott; 13.12.2009 в 19:49.
Gott вне форума Ответить с цитированием
Старый 13.12.2009, 20:15   #4
Gott
 
Регистрация: 29.04.2009
Сообщений: 4
По умолчанию

Up, все еще нужна помощь
Gott вне форума Ответить с цитированием
Старый 13.12.2009, 20:21   #5
Gott
 
Регистрация: 29.04.2009
Сообщений: 4
По умолчанию

Сам разобрался. Для тех кому надо:

Код:
type
  TLoadingForm = class(TForm)
//  function GetCPUSpeed: double; stdcall;
Здесь в секции type модуля Loading должна быть полная сигнатура функции.
Gott вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблемы с функцией ExitWindowsEx GaWs Win Api 0 20.11.2009 22:12
Проблемы с функцией lock A93 Общие вопросы C/C++ 0 24.09.2009 18:29
Проблемы с функцией mail() Linel PHP 4 24.06.2009 14:16
Проблемы с функцией FileWrite Миша Общие вопросы Delphi 5 30.05.2009 19:49
Проблемы с функцией OCIBindByName(). OSKiller PHP 2 19.03.2007 16:48