c++调用动态库dll,c# 动态加载dll
永远的神干货盘点
本节内容1、功能描述2、在Win32 Dll中创建情态的对话框3、在Win32 Dll中创建非模态的对话框3、C/C控制台程序隐藏窗口后记1、功能描述对话框可以分为情态的和非模态的两种。
2、在Win32 Dll中创建情态的对话框在一个Win32Dll中创建情态的对话框非常简单,我们都知道,Win32函数对话盒能够创建一个情态的对话框,并且情态的对话框的消息是独立于主程序消息循环的,所以可以直接在动态链接库内部建立对话框自己的窗口过程。下面就是一个在Win32 Dll中创建情态的对话框的示例:
//名称:Modal_Dialog.cpp
#包含windows.h
#包含" resource.h "
布尔回调DlgProc(HWND hwnd,UINT Msg,WPARAM wParam,LPARAM lParam)
{
开关(消息)
{
案例WM_INITDIALOG:
返回真实的
案例WM _命令:
开关(wParam)
{
案例IDOK:
MessageBox(空这是一个情态的对话框的例子, 提示,MB _ OK);
EndDialog(hwnd,0);
返回真实的
}
打破;
}
返回错误的
} extern c _ _ declspec(dll导出)void ShowDialog()
{
HINSTANCE hinst
hinst=LoadLibrary( Modal _ dialog。dll’);//获取库所在的实例句柄
DialogBox(hinst,MAKEINTRESOURCE(IDD_DIALOG1),NULL,DlgProc);
免费图书馆(hinst);
} typedef void(* FP)();
HINSTANCE hDll
复调钢琴秀;
hDll=LoadLibrary( Modal _ dialog。dll’);
Show=(fp)GetProcAddress(hDll, ShowDialog );
(*秀)();
免费图书馆(hDll);3、在Win32 Dll中创建非模态的对话框与情态的对话框不同,无模式对话框的消息是要经过主程序消息循环的,这样一来,就必须在调用该动态链接库的主程序中处理对话框的消息循环,这就无法达到利用动态链接库来完成组件化开发的要求。其实我们可以人为的非模态的对话框创建一个窗口类,我们知道窗口过程是属于窗口类的,这样一来就有了主窗口的消息循环。
//名称:Modeless _ Dialog.cpp
#包含windows.h
#包含" resource.h "
LRESULT回调WndProc(HWND,UINT,WPARAM,LPARAM);
布尔回调DlgProc(HWND,UINT,WPARAM,LPARAM);
extern c int _ _ declspec(dll导出)ShowDialog()
{
静态TCHAR szapname[]=TEXT( Modeless _ Dialog );
窗口句柄
味精味精;
WNDCLASS wndclass
HINSTANCE hInstance
HWND hDialog
h instance=LoadLibrary( Modeless _ dialog。dll’);
wnd类。style=CS _ HREDRAW CS _ VREDRAW
wndclass.lpfnWndProc=WndProc
wnd类。cbclsextra=0;
wnd类。cbwndextra=DLGWINDOWEXTRA//注意!
wnd类。h实例=h实例;
wnd类。hicon=加载图标(h实例,SZ appname);
wnd类。hcursor=load cursor(NULL,IDC _ ARROW);
wnd类。HBR背景=(HBRUSH)(颜色_ BTN脸1);
wndclass.lpszMenuName=NULL
wnd类。lpszclassname=SZ appname
hwnd=CreateWindow(szAppName,TEXT(Modeless_Dialog ),
WS _ overlapped window WS _ clip子窗口,
CW_USEDEFAULT,CW_USEDEFAULT,
CW_USEDEFAULT,CW_USEDEFAULT,
NULL,NULL,hInstance,NULL);
//ShowWindow (hwnd,icmd show);//并不在这里显示主窗口
//更新窗口(hwnd);
hDialog=CreateDialog(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),hwnd,DlgProc);
while ( GetMessage( msg,NULL,0,0))
{
if( hDialog==0 !IsDialogMessage(hDialog,msg))
{
翻译消息(味精);
调度消息(消息);
}
}
返回msg.wParam
}
布尔回调DlgProc(HWND hDlg,UINT消息,WPARAM wParam,LPARAM lParam)
{
开关(消息)
{
案例WM_INITDIALOG:
返回真实的
案例WM _命令:
开关(wParam)
{
案例(IDOK):
MessageBox(空这是一个非模态的对话框的例子, 提示,MB _ OK);
销毁窗口(hDlg);
PostQuitMessage(0);
返回真实的
}
}
返回错误的
}
LRESULT回调WndProc (HWND hwnd,UINT消息,WPARAM wParam,LPARAM lParam)
{
开关(消息)
{
案例WM_DESTROY:
PostQuitMessage(0);
返回0;
}
返回DefWindowProc(hwnd,message,wParam,lParam);
}3、碳/碳控制台程序隐藏窗口方法一
在代码头文件下加一句话:# pragma comment (linker,/subsystem: windows /entry: maincrtstartup )//设置入口地址# includewindows.h。
# pragma comment (linker,/subsystem: windows /entry: maincrtstartup )//设置项地址
int main()
{
MessageBox(NULL,你好,爱读书的小穆,NULL);
返回0;
}注意:在编译器下运行时黑框还是会出现,直接运行编译好的exe程序就不会出现了。
方法二:
用API函数隐藏自己的窗口,但是一个黑框会快速闪烁。#包含windows.h
int main()
{
HWND hwnd=NULL
hwnd=FindWindow( ConsoleWindowClass ,NULL);
if(hwnd){
ShowWindow(hwnd,SW _ HIDE);
}
MessageBox(NULL,你好,爱看书的小穆,MB _ OK);
系统(“暂停”);
返回0;
}方法三:
写第二个程序,间接启动第一个程序,隐藏窗口。#包含windows.h
int main()
{
WinExec(MyTest.exe ,SW _ HIDE);
返回0;
}方法四:
编写vbscript脚本:object.run (strcommand,[int window style],[bwaitonreturn])setobjshell=createobject(" wscript . shell ")
objShell。Run(MyTest.exe ,0,FALSE)Set objShell=CreateObject(" Wscript。外壳”)
objShell。运行“记事本”,真
objShell。runset wsh shell=wscript . createobject( wscript . shell )
return=wsh shell . run( notepad wscript . script full name,1,true)run函数有三个参数:
第一个参数是要执行的程序的路径。
第二个程序是窗口形式,后台运行0;1表示正常运行;2表示程序被激活并最小化显示;3表示程序被激活并最大化显示;这样的参数有10个,我只列出了4个最常用的。
第三个参数指示该脚本是等待还是继续执行。如果设置为true,脚本将在向后执行之前等待调用程序退出。
实际上,作为一个函数,run前面有一个接受返回值的变量。一般来说,如果返回0,表示执行成功。如果不为0,返回值是错误代码,通过这个代码可以找到对应的错误。
后记如果你觉得这些话用处不大,可以给作者点个赞;( ̄ ̄)
如果你觉得作者的文笔不那么good//(12 o _ o?
谢谢小伙伴们(’)(`)!
爱看书的。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。