为了研究VC下的DLL,特地写了一个(但是有问题) ( 积分: 100 )

  • 主题发起人 主题发起人 wp231957
  • 开始时间 开始时间
W

wp231957

Unregistered / Unconfirmed
GUEST, unregistred user!
#include <windows.h>
#include "max.h"
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 maxnum(int a,int b)
{
if(a>b)
return a;
else
return b;
}
上面是主程序,在进入VC60时选择32位DLL--空DLL(非MFC的)
max.h的代码如下:
extern "C" __declspec(dllexport) int maxnum(int a,int b);
编译可以通过,在DELPHI下调用在SHOWMESSAGE到正确的结果后
出现内存地址非法访问的错误是何原因
DELPHI 调用如下:
function maxnum(a,b:integer):integer;stdcall;external 'g:/tdll2.dll';
procedure TForm1.Button6Click(Sender: TObject);
begin
showmessage(inttostr(maxnum(5,19)));
end;
 
#include <windows.h>
#include "max.h"
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 maxnum(int a,int b)
{
if(a>b)
return a;
else
return b;
}
上面是主程序,在进入VC60时选择32位DLL--空DLL(非MFC的)
max.h的代码如下:
extern "C" __declspec(dllexport) int maxnum(int a,int b);
编译可以通过,在DELPHI下调用在SHOWMESSAGE到正确的结果后
出现内存地址非法访问的错误是何原因
DELPHI 调用如下:
function maxnum(a,b:integer):integer;stdcall;external 'g:/tdll2.dll';
procedure TForm1.Button6Click(Sender: TObject);
begin
showmessage(inttostr(maxnum(5,19)));
end;
 
必须将 vc 的输出函数声明为 stdcall 的
 
请问,如何声明为STDCALL,偶对VC不熟
 
extern "C" __declspec(dllexport) int __stdcall maxnum(int a,int b);//MAX.h
如果报错,那么把__stdcall 逐次前移,交换关键词位置.
 
修改project属性是__stdcall,然后加个def文件是最快捷的了
 
(修改project属性是__stdcall)
那么请问楼上的 “修改project属性是__stdcall” 这步骤是怎样的呢?
 
在解决方案->项目=>(右键)属性->C++->仔细检查每一项.
有一个默认的为<??? __cdecl ???>的冬冬,就是这里
不过不建议修改这里
 
一般vc写的DLL提倡用Cdecl在delphi声明
function maxnum(a,b:integer):integer;Cdecl;
external 'g:/tdll2.dll';
 
This is the reason:
For 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.
The cdecl convention is useful when you call functions from DLLs written in C or C++, while stdcall and safecall are used for Windows API calls.
//That's OK!
 
有了正确答案怎么还不结贴?!
楼主的问题一个都没结过哦
 
不好意思
1.我不怎么会结贴
2.我不怎么来这里
 
后退
顶部