c++主函数如何调用"WinMain"函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++主函数如何调用"WinMain"函数相关的知识,希望对你有一定的参考价值。

WinMain是Win32程序的主入口,就像main是控制台程序的主入口。一个exe项目中主入口要么是WinMain,要么是main,不能两者同时存在。所以在写Windows程序时,你的“主函数”就应该是WinMain,而不是主函数去调用WinMain。追问

如果我把WinMain改个名字怎么才能在int main函数里面调用它呢?
我这样在int main()函数里面调用也不行啊。
WinMain1(HINSTANCE hInst, HINSTANCE, LPSTR lpCmd, int nShow);

追答

你好像没有理解我的意思,WinMain在Windows程序中的作用就相当于控制台程序中的main。你写Windows程序,入口就必须是WinMain。
所以你要做的修改就是删除18行之后的所有内容,就这么简单。

参考技术A


在main函数前给出声明和定义并在main函数中调用

void fun()


int main()

    fun();
    return 0;

在main函数前给出声明,定义在main函数之后,在main函数中调用

void fun();
int main()

    fun();
    return 0;

void fun()




追问

你是内容都不看就胡乱回答了,我这函数明明就在主函数之前好吧。

JNA 调用c++函数的出错,java能加载库,但是找不到c++写的函数

void func(char*);这是c++的函数;
jna 接口中对应的函数为void func(string a);
能加载so文件,但是找不到这个函数,报错如下:
Exception in thread "main" java.lang.UnsatisfiedLinkError: Error looking up function 'func': /lib/libfunc.so: undefined symbol: func
c++源码的include和extern c这些地方是不是有些要注意的关键细节?
系统:ubuntu 14.04

调用C++编译的代码能调用到库但是找不到函数,应该是因为C++编译器会破坏函数的名称。

对此,一般网上能查到两种方法解决:

    用extern C ,功能是将部分代码用C编译器进行编译,因为 C编译器不会改变函数的函数名,Java中就可以用代码中的函数名调用了。

    用def模板

注1:这里说的方法你需要自己去查一下,别人的文章会写得比较清楚,看完整的文章能学到更多。

注2: 对于C和C++编译器对函数名的影响,这里和你说一下如何查看:你想看看C++编译器编译的DLL的方法名可以用depends反编译程序,把dll拖进depends程序窗口,左边会有依赖树,点击最顶端你的“库名.dll”,右边就能看到dll中函数被C++编译之后的名字。如下图:

    用C编译的DLL:

2. 用C++编译的DLL:

参考技术A import com.sun.jna.Library;
import com.sun.jna.Native;
public class TestSo
public interface LgetLib extends Library
// 调用linux下面的so文件,注意,这里只要写test就可以了,不要写libtest,也不要加后缀
LgetLib INSTANCE = (LgetLib) Native.loadLibrary("test",LgetLib.class);
int add(int a,int b);

public int add(int a,int b)
return LgetLib.INSTANCE.add(a,b);

public static void main(String[] args)
TestSo ts = new TestSo();
int c = ts.add(10,20);
System.out.println("10+20="+c);

以上是关于c++主函数如何调用"WinMain"函数的主要内容,如果未能解决你的问题,请参考以下文章

如何将入口点过程从“WinMain”更改为“main”或任何自定义函数?

WinMain

如何在 C++ 中并行化一个 for 循环,只创建一次线程池

主函数WinMain

winmain中一使用这个函数MyRegisterClass提示无法重载

C++概念小结