一个几乎是送分的dll问题!!!!

xrxrxr 2001-04-27 07:21:00
我编写的dll函数(不是mfc的),如果不加WINAPI标志的话,就不能被VB调用,如果家的话,在VC中调用时不能有参数有参数就出错??怎么解决好呢?
...全文
134 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
xrxrxr 2001-04-28
  • 打赏
  • 举报
回复
duz(肚子):能详细的说一下调用的时候怎么声明呢?
Benni 2001-04-28
  • 打赏
  • 举报
回复
谢谢两位给我做补充。
fir2000 2001-04-27
  • 打赏
  • 举报
回复
使用的时候声明必须和定义必须一致.
一个是调用问题,现在一般的dll都是pascal调用即_stdcall .当然也可以是_cdecl调用.但_cdecl调用是不能用vb来调用的.(WINAPI是一个宏,就是_stdcall.)
另一个是名字修饰问题.c++,和C的名字修饰是不一样的.在调用声明中和dll中必须一致.如果你的dll是c方式的.声明是要这样:extern "C" _stdcall(or _cdecl) int myfunc(....);
c++的默认方式是extern "C++".
duz 2001-04-27
  • 打赏
  • 举报
回复
在VC中调用时,你需要声明调用格式是WINAPI(not pascal,but __stdcall),不然,c中会默认为标准c调用格式(__cdecl),当然在有参数时会破坏堆栈而出错。
比如在DLL中写了函数
int __stdcall YourFunction(int param1,void *param2)
{
}

在调用的地方,你需要先声明
int __stdcall YouFunction(int param1,void *param2);
Benni 2001-04-27
  • 打赏
  • 举报
回复
是这样的,加WINAPI标志,是声明pascal调用(否则是标准C调用),所以在VC中显式调用时,在声明类型时也要加上WINAPI标志。(能否隐式调用我不太清楚)
例如:
在dll中
#define DLLEXPORT __declspec(dllexport)
DLLEXPORT void WINAPI PluginStart(int i)
{
....
}

那么在VC中
typedef void (WINAPI *PLUGINSTART)(int);/*也要加WINAPI*/
PLUGINSTART PlugIn;
....
PlugIn= (PLUGINSTART)::GetProcAddress(hDllIns,"PluginStart");
...

不知以上回答您是否能够满意?

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧