delphi调用VC的DLL(100分)

  • 主题发起人 主题发起人 小天
  • 开始时间 开始时间

小天

Unregistered / Unconfirmed
GUEST, unregistred user!
VC:
extern "C" _declspec(dllexport) int test(char * filename);
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
extern "C" _declspec(dllexport) int test(char * filename)
{
if (filename=="abc")
return 0;
else
return -1;
}
delphi:
function test(filename:pchar):Integer;
stdcall;external 'xxx.dll';
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
var x:integer;
begin
x:=test('abc');
Label1.Caption:=inttostr(x);
end;

执行时为什么总是越“没有特权”啊
 
我今天遇到一个与 C 有关的问题,即调用 C 的 Dll 库。其中两个函数为:
int GetBuyData(unsigned char *data);

int GetinvoiceNum(DWord * Num);
它们的数据类型 Unsigned char * 和 DWord * 如何转换为 Delphi 的类型,又如何
进行赋值和将值转换为 String 型。
特此感谢!!!
wjk
wenjk@couragetech.com.cn
 
加一个var就行了
 
function test(filename:pchar):Integer;
stdcall;external 'xxx.dll';
???
是否该是
function test(filename:pchar):Integer;
cdecl;external 'xxx.dll';

Char * = Delphi pChar
DWord * Num = Delphi pInteger
or
Var Num:DWord;


 
使用delphi调用vc写的DLL,最好在VC的声明语句中使用__stdcall参数,在Delphi
的调用语句中注明调用参数为:stdcall
如:
VC: extern "c" int __stdcall test(char * filename);
delphi: function test(filename:pchar):Integer;
stdcall;external 'xxx.dll';
这样,系统知道双方调用的参数都是stdcall。另外,附上调用参数的对照:
delphi vc
register __fastcall
~~~~~~~~
pascal __pascal
cdecl __cdecl
~~~~~~~~~
stdcall __stdcall
带下划线的是缺省的调用参数。
 
1. VC DLL为扩展DLL。delphi只能用cdecl方式调用。如果DLL声明为stdcall,delphi中用cdecl和    stdcall都会出错。
2. VC DLL为常规DLL。DLL中只能导出C样式的函数,不能导出C++类,成员函数或重载函数。如果用到 了MFC就要在每个导出函数中都使用:
   AFX_MANAGE_STATE(AfxGetstatic ModuleStute());
 
多人接受答案了。
 
后退
顶部