![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Доброго времени суток.
Есть библиотека dl, имеется к ней header. Код:
int __stdcall SomeFunction(
const int hFile,
const char* varName,
char* varLabel); Код:
function SomeFunction(hFile: Integer; varName: PAnsiChar; var varLabel: PAnsiChar): Integer; stdcall; Функция сама память не выделяет, в мануале написано выделять вручную 121 байт. Код:
...
var
Arr: Array [0..121] of AnsiChar;
MyPointer: PAnsiChar;
...
Arr := ''; //clear array
//У гансмокера прочитал, что это корректная запись, там есть пример таких же действий
MyPointer := Arr; //assign pointer to static array
SomeFunction(FileH, VarName, MyPointer));
Write(Format('|%s|,|%s|', [VarName, Arr]));В результате у меня строка получается обрезанная спереди неизвестно на сколько байт, но обрезанная это точно. Что не правильно делаю? |
|
#2
|
||||
|
||||
|
Похоже не хватает функциональной пары GetMem...FreeMem или может нужно передавать указатель^ на переменную с последующей SetLength, а может просто сменить её тип на pchar...
Вот пример на основе считывания инфы из файла Код:
... var fpdt: file of byte; sm: integer; text: pchar; fd: string; ... ... GetMem(text, sm); BlockRead(fpdt, text^, sm); fd:= string(text); SetLength(fd, sm); FreeMem(text); ... |
|
#3
|
||||
|
||||
|
Код:
procedure TForm1.FormCreate(Sender: TObject);
var
Arr: Array [0..121] of AnsiChar;
MyPointer: PAnsiChar;
begin
MyPointer:=@Arr[1];
SomeFunction(0, PAnsiChar('qq'), MyPointer);
end; |
|
#4
|
|||
|
|||
|
Код:
procedure TForm1.FormCreate(Sender: TObject);
var
Arr: Array [0..121] of AnsiChar;
MyPointer: PAnsiChar;
begin
MyPointer:=@Arr[1];
SomeFunction(0, PAnsiChar('qq'), MyPointer);
end;Работает идентично моему коду. Потом я переключился в WIN32 и теперь все время Access violation, а под 64 бит пол строки читает ![]() DLL соответственно у меня есть x86 и x64 Что-то не то с памятью. Код:
function SomeFunction(hFile: Integer; varName: PAnsiChar; var varLabel: Pointer): Integer; stdcall;
var
VarLabel: Pointer;
GetMem(MyPointer, 120);
SomeFunction(0, PAnsiChar('qq'), MyPointer);// на этой строке нормально
FreeMem(VarLabel, 120); // на этой падаетТакое впечатление, что функция портит память. При том что другие функции которые выделяют память самостоятельно работают отлично, например вот такая: Код:
SPSSDIO_API int __stdcall spssGetVarNames(
const int hFile,
int* numVars,
char* * * varNames,
int* * varTypes);
function spssGetVarNames(hFile: Integer; var numVars: Integer;
var varNames: PPAnsiChar; var varTypes: PInteger): Integer; stdcall;
var
VarNames: PPAnsiChar;
spssGetVarNames(FileH, VariableCount, VarNames, VarArray);У кого есть какие мысли? |
|
#5
|
|||
|
|||
|
Всем спасибо. Решение оказалось таким простым, что я его не заметил сразу.
Delphi самостоятельно передает указатель вместо значения если в параметре функции указано ключевое слово var. По этому если памятью нужно управлять самостоятельно то передаем нулевой элемент массива. Код:
procedure TForm1.FormCreate(Sender: TObject);
var
Arr: Array [0..121] of AnsiChar;
begin
SomeFunction(0, PAnsiChar('qq'), Arr[0]); //Не опечатка, нулевой элемент
end;Функция импортирована так Код:
int __stdcall SomeFunction(
const int hFile,
const char* varName,
char* varLabel);
function SomeFunction(hFile: Integer; varName: PAnsiChar; var varLabel:AnsiChar): Integer; stdcall; |
|
#6
|
|||
|
|||
|
>Функция
Код:
int __stdcall SomeFunction(
const int hFile,
const char* varName,
char* varLabel);Код:
function SomeFunction(hFile: Integer; varName: PAnsiChar; var varLabel:AnsiChar): Integer; stdcall; Код:
function SomeFunction(hFile: Integer; varName: PAnsiChar; varLabel:AnsiChar): Integer; stdcall; |