thiscall в FPC в явном виде не используется, но он неявно возникает при импорте классов, написанных на c++, например при работе с OpenOffice. Импорт отдельных методов из dll-файла есть более гибкое решение, чем использование ключевого слова cppclass.
Наример, есть класс написанный на c++
- Код: Выделить всё
- class __declspec(dllexport) Foo
 {
 public:
 Foo()
 {
 i = 0;
 cout<<"create"<<endl;
 }
 ~Foo()
 {
 cout<<"death"<<endl;
 }
 void inc()
 {
 i++;
 cout<<"increment"<<endl;
 }
 void print()
 {
 cout<<"value is "<<i<<endl;
 }
 
 private:
 int i;
 };
 
С помощью утилиты dumpbin легко получить таблицу экспортируемых методов.
- Код: Выделить всё
- 0 00001AF0 ??0Foo@@QAE@XZ public: __thiscall Foo::Foo(void)
 1 00001B20 ??1Foo@@QAE@XZ public: __thiscall Foo::~Foo(void)
 2 000013D0 ??4Foo@@QAEAAV0@ABV0@@Z public: class Foo & __thiscall Foo::operator=(class Foo const &)
 3 00001B60 ?inc@Foo@@QAEXXZ public: void __thiscall Foo::inc(void)
 4 00001BA0 ?print@Foo@@QAEXXZ public: void __thiscall Foo::print(void)
 
Соответственно эти функции импортируются в программе на fpc:
- Код: Выделить всё
- procedure FooCreate;stdcall;external 'wins.dll' name '??0Foo@@QAE@XZ';
 procedure FooDestroy;stdcall;external 'wins.dll' name '??1Foo@@QAE@XZ';
 procedure FooInc;stdcall;external 'wins.dll' name '?inc@Foo@@QAEXXZ';
 procedure FooPrint;stdcall;external 'wins.dll' name '?print@Foo@@QAEXXZ';
 
c++ при вызове методов использует thiscall, соответственно это тот же stdcall но дополнительно в регистре ECX передается узаказтель на объект (this). Соответственно выполнение программы на fpc выглядит следующим образом:
- Код: Выделить всё
-   GetMem(this,size);
 
 asm
 MOV ECX, this
 end;
 FooCreate;
 asm
 MOV ECX, this
 end;
 FooInc;
 asm
 MOV ECX, this
 end;
 FooInc;
 asm
 MOV ECX, this
 end;
 FooPrint;
 asm
 MOV ECX, this
 end;
 FooDestroy;
 
 FreeMem(this);
 
результат:
- Код: Выделить всё
- create
 increment
 increment
 value is 2
 death