|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Выделение памяти для сторонней функции из DLL
Доброго времени суток.
Есть библиотека 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; |