vb.net生成java可调用的dll(2)
extern"C"__declspec(dllexport)voidWINAPIShowForm()ShowForm是方法名,WINAPI是什么呢?我没写也编译通过了,很...
extern "C" __declspec(dllexport) void WINAPI ShowForm()
ShowForm是方法名,WINAPI 是什么呢?我没写也编译通过了,很费解阿。
写上WINAPI的话报错。
代码:
extern "C" __declspec(dllexport) void WINAPI CallNativeMethod1()
{
Form1^ form1 = gcnew Form1();
form1->Start();
} 展开
ShowForm是方法名,WINAPI 是什么呢?我没写也编译通过了,很费解阿。
写上WINAPI的话报错。
代码:
extern "C" __declspec(dllexport) void WINAPI CallNativeMethod1()
{
Form1^ form1 = gcnew Form1();
form1->Start();
} 展开
5个回答
展开全部
调用函数的时候内部的工作原理。
不加的话默认是__cdecl,加的话变成__stdcall,
虽然没有硬性规定,不过DLL导出方法比较习惯会是后一种。
它涉及到调用函数的时候如何传递参数。
函数调用的时候参数是通过运行时栈来传递的,将参数放入栈中,然后进入函数代码执行
在执行完函数代码之后,要将栈中的参数清理掉。此时应该由哪一边来清理,是__cdecl和__stdcall最大的不同。
前者的原则是谁放进栈的谁清理,后者的原则是谁用完谁清理。
只要保证调用的一方的声明和被调用的一方的声明一致,就没有问题
否则会出现两边都不清理参数或者参数被重复清理的问题,都会造成栈的不平衡,然后大多数情况下这个时候程序崩溃
啥?写上WINAPI报错是不是没有引入必要的头文件啊比如windows.h……
直接写 __stdcall 来代替WINAPI也可以,如果没有引入头文件的话……
不加的话默认是__cdecl,加的话变成__stdcall,
虽然没有硬性规定,不过DLL导出方法比较习惯会是后一种。
它涉及到调用函数的时候如何传递参数。
函数调用的时候参数是通过运行时栈来传递的,将参数放入栈中,然后进入函数代码执行
在执行完函数代码之后,要将栈中的参数清理掉。此时应该由哪一边来清理,是__cdecl和__stdcall最大的不同。
前者的原则是谁放进栈的谁清理,后者的原则是谁用完谁清理。
只要保证调用的一方的声明和被调用的一方的声明一致,就没有问题
否则会出现两边都不清理参数或者参数被重复清理的问题,都会造成栈的不平衡,然后大多数情况下这个时候程序崩溃
啥?写上WINAPI报错是不是没有引入必要的头文件啊比如windows.h……
直接写 __stdcall 来代替WINAPI也可以,如果没有引入头文件的话……
更多追问追答
追问
之前生成的dll,用java调用的时候是看不到方发名的,现在能看到了,但是调用的时时候出错。我用c++写了一个main函数调用vb的那个dll的时候发现报System.BadImageFormatException:异常。我百度了一下,说有可能是版本不一致出现的,我的vb,vc都是单独express版本vb是2010 vc++是2005,会是由于这个原因导致的异常么?
追答
VC++是2005的,用的运行时是 .net framework 2.0,VB.net是2010的,默认使用的运行时是 .net framework 4.0,这两者是不兼容的。
你要不要弄个VC++2010来看看……不过先提醒你,VC++2010在CLR方面是没有智能感知的,就是输入双冒号啊、箭头啊这一类的时候不会出来一个列表给你选(2012会出来
展开全部
VC有两种函数调用方式 一种是__stdcall,另一种是__cdecl
函数的调用方式有两种一种是PASCAL调用方式,另一种是C调用方式
使用PASCAL调用方式,函数在返回到调用者之前将参数从栈中删除
使用C调用方式,参数的删除是调用者完成的
WinMain函数是由系统调用的,Windows系统规定由系统调用的函数都遵守PASCAL调用方式
但是VC中函数的缺省调用方式是__cdecl,也就是C调用方式
所以在WinMain前显示的声明。
在Windows编程中将遇到很多声明修饰符,如CALLBACK,WINAPI,PASCAL这些在IntelCPU的计算机上都是__stdcall
详细的声明细节请看windef.h文件
函数的调用方式有两种一种是PASCAL调用方式,另一种是C调用方式
使用PASCAL调用方式,函数在返回到调用者之前将参数从栈中删除
使用C调用方式,参数的删除是调用者完成的
WinMain函数是由系统调用的,Windows系统规定由系统调用的函数都遵守PASCAL调用方式
但是VC中函数的缺省调用方式是__cdecl,也就是C调用方式
所以在WinMain前显示的声明。
在Windows编程中将遇到很多声明修饰符,如CALLBACK,WINAPI,PASCAL这些在IntelCPU的计算机上都是__stdcall
详细的声明细节请看windef.h文件
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
要想java调用dll,必须先在java里声明一个native方法,然后编译,再用javap yourClass创建出头文件,然后再根据这个头文件写动态库
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
ocx有没有加壳?
要不要我试试看能不能破解这个ocx,把COleControl.IsInvokeAllowed给重写了……
不一定确保成功。
如果想试试看的话把这个ocx给我。
不过要我能用C++正确加载的……(就是说别缺什么文件
我跟踪一下看看有没有办法。
不行的话给你外挂一个dll把这个函数hack进去
要不要我试试看能不能破解这个ocx,把COleControl.IsInvokeAllowed给重写了……
不一定确保成功。
如果想试试看的话把这个ocx给我。
不过要我能用C++正确加载的……(就是说别缺什么文件
我跟踪一下看看有没有办法。
不行的话给你外挂一个dll把这个函数hack进去
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询