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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> с to delphi, конвертация кода 
:(
    Опции темы
kudesnery
Дата 10.9.2012, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



помогите конвертировать сишный код на delphi. надо вызвать функцию с dll, но выдает ошибку. 


Код

        public bool ProtectionPartitionSet( byte bDisk, byte bPartition, string strPassword, string strPasswordHint )
        {
            bool bRetVal = false;
            byte[] abPassword = StringToBytes( strPassword );
            byte[] abPasswordHint = StringToBytes( strPasswordHint );
            int iRetVal = InteropLibrary.ProtectionPartitionSet( bDisk, bPartition, abPassword, abPasswordHint );
            bRetVal = iRetVal != 0 ? true:false;
            return bRetVal;
        }


            public static extern unsafe int ProtectionPartitionSet( byte bDisk, byte bPartition, byte[] lpbPassword, byte[] lpbPasswordHint );
 
            [ DllImport( "DISKPP_KERNEL.DLL", EntryPoint="ProtectionPartitionSetSafely",
                  CharSet=CharSet.Ansi, ExactSpelling=false,
                  CallingConvention=CallingConvention.StdCall ) ]
            public static extern unsafe int ProtectionPartitionSetSafely( byte bDisk, byte bPartition, byte[] lpbPassword, byte[] lpbPasswordHint );



        private static byte[] StringToBytes( string str )
        {
            byte[] abRetVal = null;
            if ( str.Length > 0 )
            {
                abRetVal = new byte[ str.Length + 1 ];
                for ( int i = 0 ; i < str.Length ; i++ )
                {
                    abRetVal[ i ] = Convert.ToByte( str[ i ] );
                }
                abRetVal[ str.Length ] = 0;
            }
            return abRetVal;
        }



Код

procedure TForm1.Button5Click(Sender: TObject);
var Hbar: Thandle;
DetectDevices: function ():longbool;
GetDisksCount:function (): LONGBOOL;
ProtectionPartitionSet:function(a:BYTE ;  b:BYTE ; c:byte ; d:byte): DWORD;
begin
Hbar := LoadLibrary('diskpp_kernel.dll');
if Hbar >= 32 then { успешно }
begin
DetectDevices := GetProcAddress(HBar, 'DetectDevices');
GetDisksCount := GetProcAddress(HBar, 'GetDisksCount');
ProtectionPartitionSet := GetProcAddress(HBar, 'ProtectionPartitionSet');
 
DetectDevices;
error('ошибка ');  // все нормально
GetDisksCount;
error('ошибка ');  // все нормально
ProtectionPartitionSet ( 01, 03,01,01);
error('ошибка ');  // ошибка - Переданы некорректные параметры
 
end;
end;
 
 
 
procedure TForm1.Error(msg: string);
var
Hbar: Thandle;
    s: string;
  GetLastErrorDll  :function(): DWORD;
begin
Hbar := LoadLibrary('diskpp_kernel.dll');
GetLastErrorDll:= GetProcAddress(HBar, 'GetLastErrorDll');
    s := msg + #13#10 + '(Error code: ' + IntToStr(GetLastErrorDll) + ')';
    MessageBox(Handle, PChar(s), nil, 0);
end;

PM MAIL   Вверх
math64
Дата 10.9.2012, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

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



Ошиблись разделом. Где  здесь C/C++ ? Вижу C# и Delphi
На какую версию Delphi?
Раз С# - для .Net, то и Delphi нужен для .Net

PM   Вверх
kudesnery
Дата 10.9.2012, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



версия delphi 7

Добавлено через 11 минут и 25 секунд
в c++ sdk :

Код

typedef BOOL ( WINAPI* TProtectionPartitionSet )( BYTE, BYTE, LPBYTE, LPBYTE );


extern "C" TProtectionPartitionSet                    ProtectionPartitionSet;


Код

 ProtectionPartitionSet           = (TProtectionPartitionSet) ::GetProcAddress( (HMODULE)hLib, "ProtectionPartitionSet" );


ссылки
sdk
док по функциям
PM MAIL   Вверх
kami
Дата 10.9.2012, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

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



Код

function ProtectionPartitionSet(Disk, Partition: byte; lpbPassword, lpbPasswordHint: PAnsiChar): integer; stdcall; external 'diskpp_kernel.dll'

Хотя насчет integer не уверен - в шарпах написано Int, а в cpp - bool. По размерности-то нормально, а вот по результату...

При таком объявлении функция StringToBytes не нужна.
PM MAIL WWW   Вверх
kudesnery
Дата 10.9.2012, 20:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Код

void __fastcall TForm1::Button1Click(TObject *Sender)
{
   hLib = ::LoadLibrary ( "diskpp_kernel.dll" );
   if ( hLib == NULL )
      {      do_msg ( KERNEL_DLL_NOT_FOUND );
          return;
      }

   LoadDPPLibraryFunctions( hLib );
   ProtectionPartitionSet(00,03,"demo1","demo1");

 }

сдесь все работает...
а вот в  delphi 
Код

 ProtectionPartitionSet(00,03,'demo1','demo1');
  выдает ошибку.  может с++ конвертирует строковые параметры при компиляции(бред-не бред)...хотя это обьявлено как lpbyte 
PM MAIL   Вверх
kami
Дата 10.9.2012, 21:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

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



Цитата(kudesnery @  10.9.2012,  20:12 Найти цитируемый пост)
выдает ошибку.

Какую ошибку? 
PM MAIL WWW   Вверх
kudesnery
Дата 10.9.2012, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



конвертирую string в массив байтов и передаю, поменяв lpbyte на array of byte 

Код

ProtectionPartitionSet:function(Disk, Partition: byte; L,P: array of byte): integer;


возвращает ошибку -  переданы некорректные параметры. 




Это сообщение отредактировал(а) kudesnery - 10.9.2012, 21:52
PM MAIL   Вверх
kami
Дата 10.9.2012, 22:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

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



Цитата(kudesnery @  10.9.2012,  21:52 Найти цитируемый пост)
конвертирую string в массив байтов и передаю, поменяв lpbyte на array of byte 

Я показал, как нужно объявить функцию. Последовать совету религия не позволяет? У вас в объявлении сразу несколько ошибок.
PM MAIL WWW   Вверх
kudesnery
Дата 10.9.2012, 22:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



точняк... smile  что то я когда в первый раз тестил - внимание потерял...спс
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.0508 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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