Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > с to delphi


Автор: kudesnery 10.9.2012, 15:02
помогите конвертировать сишный код на 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;

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

Автор: kudesnery 10.9.2012, 15:44
версия delphi 7

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

Код

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


extern "C" TProtectionPartitionSet                    ProtectionPartitionSet;


Код

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


ссылки
http://www.fayloobmennik.net/2181606
http://www.fayloobmennik.net/2181702

Автор: kami 10.9.2012, 20:02
Код

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

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

При таком объявлении функция StringToBytes не нужна.

Автор: kudesnery 10.9.2012, 20:12
Код

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 

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

Какую ошибку? 

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

Код

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


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



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

Я показал, как нужно объявить функцию. Последовать совету религия не позволяет? У вас в объявлении сразу несколько ошибок.

Автор: kudesnery 10.9.2012, 22:37
точняк... smile  что то я когда в первый раз тестил - внимание потерял...спс

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)