помогите конвертировать сишный код на 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;
|
|