Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi
Войти
Регистрация
Восстановить пароль
 
kudesnikk
0 / 0 / 0
Регистрация: 30.07.2012
Сообщений: 29
1

с to delphi

10.09.2012, 15:34. Просмотров 482. Ответов 7
Метки нет (Все метки)

мне надо использовать функцию из библиотеки. сделать это надо в delphi. но никак не получается вызвать ее. ошибка - неправильные параметры.


C#
1
2
3
4
5
6
7
8
9
        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;
        }
C#
1
2
3
4
5
6
            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 );

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
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;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.09.2012, 15:34
Ответы с готовыми решениями:

Какие отличия Delphi 5, Delphi 6 и Delphi 7
Кто-нибудь юзал Delphi 6? Если да, то напишите, плиз, его отличия от 5-ой версии (плюсы и минусы)...

Новая редакция Delphi: Delphi XE Starter Edition
Хочется запостить новость. Сегодня Embarcadero представила новую редакцию Delphi и C++ Builder:...

Что использовать - Delphi XE6 или Delphi 7?
Delphi EX6 или Delphi 7? Какая разница(интерфейс не трогать)? Где больше +/-?Что использовать?...

Откроется ли программа, написанная в Delphi 7, в Delphi 6?
:):):)

Delphi 2010 feat. Delphi XE2
Добрый день. Установлена Делфи 2010. Ставлю ХЕ2. Почитав информацию, понял, что конфликтов не...

7
antikiler_
1080 / 566 / 79
Регистрация: 07.04.2011
Сообщений: 971
Записей в блоге: 2
10.09.2012, 15:46 2
А если так
Delphi
1
ProtectionPartitionSet ( 1, 3,'01','01');
0
kudesnikk
0 / 0 / 0
Регистрация: 30.07.2012
Сообщений: 29
10.09.2012, 15:56  [ТС] 3
Цитата Сообщение от antikiler_ Посмотреть сообщение
А если так
Incompatible types: 'Byte' and 'string'.
дело в том что я в синтаксисе с ничего не знаю...

этот string он переводит в byte.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
        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;
        }
и еще в чем отличия byte от byte[]
0
antikiler_
1080 / 566 / 79
Регистрация: 07.04.2011
Сообщений: 971
Записей в блоге: 2
10.09.2012, 15:59 4
Цитата Сообщение от kudesnikk Посмотреть сообщение
и еще в чем отличия byte от byte[]
Насколько Я понял это байт и массив байтов
0
kudesnikk
0 / 0 / 0
Регистрация: 30.07.2012
Сообщений: 29
10.09.2012, 16:28  [ТС] 5
если даже как массив передавать - результат такой же.

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
var
  arr:array[0..3] of byte =  (ord('d'),ord('e'),ord('m'),ord('o'));
 
 
procedure TForm1.Button5Click(Sender: TObject);
var Hbar: Thandle;
DetectDevices: function ():longbool;
GetDisksCount:function (): LONGBOOL;
ProtectionPartitionSet:function(a:BYTE ;  b:BYTE ; c:array of byte; d:array of 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,arr,arr);
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;
0
antikiler_
1080 / 566 / 79
Регистрация: 07.04.2011
Сообщений: 971
Записей в блоге: 2
10.09.2012, 17:31 6
Dword - что это за тип данных у тебя?
попробуй запустить так
Delphi
1
ProtectionPartitionSet ( 01, 03,[1],][1]);
Добавлено через 22 минуты
В си# тип int идет как у нас integer, Если не менял dword и он идет как тип longword(cardinal), то возможно в этом загвоздка
0
murderer
3319 / 1465 / 134
Регистрация: 06.10.2010
Сообщений: 3,217
11.09.2012, 07:58 7
error('ошибка '); // все нормально
ГЫ

Добавлено через 3 минуты
Может так
Delphi
1
function ProtectionPartitionSet(a,b:BYTE ; c,d:string): DWORD;stdcall;external 'diskpp_kernel.dll';
Добавлено через 13 минут
Delphi
1
function ProtectionPartitionSet(a,b: byte; c,d: AnsiString): longbool;stdcall;external 'diskpp_kernel.dll';
0
kudesnikk
0 / 0 / 0
Регистрация: 30.07.2012
Сообщений: 29
11.09.2012, 10:18  [ТС] 8
помогло при обьявлении
Delphi
1
function ProtectionPartitionSet(Disk, Partition: byte; lpbPassword, lpbPasswordHint: PAnsiChar): integer; stdcall; external 'diskpp_kernel.dll'
спс всем
0
11.09.2012, 10:18
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.09.2012, 10:18

'Delphi+Interbase' или 'Delphi+SQLServer'
Господа, номного смахивает на офф-топик, но думаю всё же это самое подходящее место. Суть вопроса...

Программа на Delphi внутри программы на Delphi
Добрый вечер. Делаю тренажерный комплекс,состоящий из тестирования и программного тренажера. Все...

Интерфейс Delphi 7 как в Delphi 2010
Доброго времени суток! Подскажите пожалуйста! Возможно ли в Delphi 7 настроить интерфейс, по...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru