Показать сообщение отдельно
  #2  
Старый 08.11.2013, 22:56
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Цитата:
function GetValue(PMointer; out PNointer): boolean; stdcall; Export;
var M: integer;
MM: ^integer;
Begin
GetValue:=false;

MM:=PM;
M:=MM^;
N:=M+1;
PN:=@N;

GetValue:=true;
end;
Во-первых, не ссылка, а указатель. Надо различать.
Во-вторых, cdecl тут вообще ни при чем, т.к. соглашения вызовов регламентируют порядок параметров в стеке/регистрах и ответственность за стек.
В-третьих, все очевидно. PM - pointer, то есть void *. PN - тоже pointer, однако должен еще иметь возможность изменяться, следовательно в функцию надо передать указатель на указатель.
И получается, что вызывать надо
Код:
int MNumber;
int *ANumber;
...
GetValue(&MNumber, &ANumber); 
А конструкция
Код:
int *Mumber,
 Mumber=StrToInt(Edit2->Text);
 AMumber=&Mumber;
логически неверна, хотя работать будет. Указателю присваивается число.
Делфи же работает "ожидаемо" только потому, что он out/var параметры скрывает. Также можно и для плюсов:
Код:
bool (WINAPI *TGetValue)(int *, int *&); 
...
int MNumber;
int *ANumber;
...
GetValue(&MNumber, ANumber); 
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием