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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вызов dll внутри процедуры, Очищается стек переменных 
V
    Опции темы
TDelphist
Дата 15.4.2011, 09:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Код

unit aaUnit;

interface

uses main;

type
   Taa = class(Form)
 privat
    Resultat   : integer;
    ....
 public     
    procedure get_rez_int;
end;

 var
       get_dll_function: procedure (   i_number1
                                       , i_number2
                                          , i_number3
                                                      , i_number4
                                                      , i_number5
                                          , i_number6           : integer;
                                                        i_res                    : Pointer   )stdcall;
        LDllHandle : THandle;

implementation


procedure Taa.get_rez_int;
var
   aArray      :  array [0..15] of char;
   P              :  Pointer;
begin

   try
     P  :=  Nil;
     P  :=  @aArray;

     @get_dll_function  :=  nil;
     LDllHandle       :=  0;
     LDllHandle       :=  LoadLibrary('MyDll.dll');

     if LDllHandle >= 32 then @get_dll_function  :=  GetProcAddress(LDllHandle, 'get_dll_function');


     if @get_dll_function  <>  nil then
         get_dll_function(
                          1
                        , 5 
                        , 1 
                        , 1 
                        , 1                                                  
                        , 1                                                  
                        , @aArray                  );
     //В @aArray приходит 4-е int каждый по 4байта

     P  :=  @aArray;
      
     // Мне нужен 3ий int      
     Inc(Integer(P),8);
 
     Resultat :=  Integer(P^);  // Res обьявленна глобально к форме
   finally
     FreeLibrary(LDllHandle);
     P  :=  Nil;
     LDllHandle := 0;
   end;
end;

procedure Taa.FormShow(Sender: TObject);
var str, str1: string;
begin
  str := 'Тест';
  get_size_interval;
  str1 := str; // после вызова dll переменная str и str1 почему то становятся вне области видимости ... и происходит AV.  
end;


Есть приложение с 10ю формами.
На одной из них при открытии окна подгружаю динамически библиотеку сделанную на C++.
Получаю AV((

Почему возникает AV?  Подскажите пожалуйста....
Уже 2ой день не могу разобраться((

Это сообщение отредактировал(а) TDelphist - 15.4.2011, 09:16
PM MAIL   Вверх
bems
Дата 15.4.2011, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Это очень плохо.
char это не байт, LoadLibrary это не ShellExecute (32 не в кассу), лишнее присваивание Р, приведение его к целому не пойми зачем. В этом всем нереально найти ошибку.
Просмотрел насколько мог. Вроде "механически" это допустимо, если совпадает сигнатура вызываемой процедуры 


--------------------
Обижено школьников: 8
PM MAIL   Вверх
bems
Дата 15.4.2011, 12:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Resultat :=  Integer(P^) выполняется даже если get_dll_function не была вызвана

Добавлено через 6 минут и 55 секунд
get_size_interval бы еще посмотреть


--------------------
Обижено школьников: 8
PM MAIL   Вверх
TDelphist
Дата 15.4.2011, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

char это не байт,


А сколько? sizeof(char) вернуло 1.


Вот так выглядит обьявление функции dll в .h

Код

#include "api.h"
extern "C"
{                
    Increment_API void get_dll_function(int p_number1,
                                          int p_number2,
                                          int p_number3,
                                          int p_number4,
                                          int p_number5,
                                          int p_number6,
                                          unsigned char* p_res);
}

#endif

Привожу к целому потому что должен получить int ы из dll

У меня крах мозга((.. 

Обернул не помогло((
 
Код

if LDllHandle >= 32 then begin
    get_dll_function(
                          1
                        , 5 
                        , 1 
                        , 1 
                        , 1                                                  
                        , 1                                                  
                        , @aArray                  );
     //В @aArray приходит 4-е int каждый по 4байта
     P  :=  @aArray;
      
     // Мне нужен 3ий int      
     Inc(Integer(P),8);
 
     Resultat :=  Integer(P^);  // Res обьявленна глобально к форме
end;






Это сообщение отредактировал(а) bems - 15.4.2011, 12:29
PM MAIL   Вверх
bems
Дата 15.4.2011, 12:20 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



char занимает один байт в старых дельфи, и два в новых. Но если тебе нужны именно байты, а не символы так и пиши Byte.
А в твоём случае можно объявить как указатель на массив из четырех Integer

во что разворачивается определение Increment_API?


--------------------
Обижено школьников: 8
PM MAIL   Вверх
TDelphist
Дата 15.4.2011, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



У меня Delphi6 .
К Dll дали только обьявление (хедер). 
Dll писали другие студенты,  полностью тело библиотеки нужно запрашивать.  Чуть попозже надеюсь пришлют.

PM MAIL   Вверх
bems
Дата 15.4.2011, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Не тело, тот Increment_API, который в самом начале объявления

Добавлено через 2 минуты и 1 секунду
Дай длл


--------------------
Обижено школьников: 8
PM MAIL   Вверх
TDelphist
Дата 15.4.2011, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Переделал на указатель из массива четырех Integer
И AV пропало.

Спасибо огромное!


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.0764 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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