调用vc写的dll出错(100分)

  • 主题发起人 主题发起人 qdlover
  • 开始时间 开始时间
Q

qdlover

Unregistered / Unconfirmed
GUEST, unregistred user!
implementation
function myadd(a:integer;b:integer):integer;stdcall; external 'staticadddll.dll' Name 'myadd';

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
t:integer;
begin
t:=myadd(1,2);
showmessage(inttostr(t));
end;
我同事给我的函数定义是 int myadd(int a,int b)

然后执行程序,按button1,显示3,然后报错
access violation at 0x00000000:read of address 0x00000000'.Process Stopped.Use step or Run to continue.
如果用
function myadd(a:integer;b:integer):integer;far; external 'staticadddll.dll' Name 'myadd';
调用,则计算结果都是错误的
用LoadLibrary,GetProcAddress方式调用,结果也是错误的
我在调用程序的工程文件(DPR)最开始引用 Sharemem 单元了,还是不行啊
请问,应该怎么解决啊?
 
function myadd(a:integer;b:integer):integer;stdcall;external 'staticadddll.dll';
 
楼上正确的,再有错误就是DLL不正确了
 
这个DLL函数简单,如果调用出错的话,一般就是DLL不对了
 
问题就在于,我怎么知道他这个vc dll有问题

我同事说他用vc调用这个dll没问题,我就有问题

应该让vc做的时候注意什么地方?
 
它是stdcall吗?vc的里面也得是stdcall才行
 
stdcall就是静态调用吧,他说是啊
 
你让他把VC的原型写出来
 
extern "C" _declspec(dllexport) int myadd(int a,int b)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState() );
TRACE("Entering myadd/n");
if(a+b>0)
return a+b;
AfxMessageBox("Can't take myadd");
return 0;
}
 
你的调用方式错了,应该是cdecl的方式。
 
o,
请问 register, pascal, cdecl, stdcall, and safecall这几个Calling conventions什么意思啊

看f1英文帮助不是很明白,也不知道为什么我这次要用cdecl
 
or all conventions except cdecl, the procedure or function removes parameters from the stack upon returning. With the cdecl convention, the caller removes parameters from the stack when the call returns.
是因为这个吗?
 
多人接受答案了。
 
后退
顶部