.net 多个dll 封装成一个dll_第一个DLL程序

f2402d93f94f39215b4273890554178b.png

先简单讲一下DLL

在Windows下,DLL(Dynamic Link Library,动态链接库)是一个被编译过的二进制程序,但与.exe文件不同,.dll文件不能独立运行,必须由其他程序调用。

为什么有这东西呢?当然有其存在的好处啦:

  1. 不限语言。我们可以用自己熟悉的语言写DLL,然后由其他语言写的可执行程序来调用这些DLL。例如,可以用Python写程序的主界面,然后调用C写的实现一个具体功能的DLL模块。
  2. 增强功能。我们看到许多产品都提供了界面插件功能,允许用户动态地更换程序的界面,这就可以通过更换界面DLL来实现。
  3. 简化管理。在一个大型项目开发中,通常都是由多个项目小组同时开发。我们可以将项目细分,将不同功能交由各项目小组以多个DLL的方式实现,这样,各个项目小组就可以同时进行开发了。
  4. 节省空间。如果多个应用程序需要同样的功能,那么可以将该功能以DLL的形式提供,这样在机器上只需要存在一份该DLL文件就可以了。另外,如果多个应用程序使用同一个DLL,该DLL只需要放入内存一次,所有的应用程序就都可以共享它了。

至于坏处嘛,就是写起来稍微麻烦一点。

在Linux环境下没有.dll文件,但也有类似的,对应的文件后缀名一般是.so(Share Object),可以看作同一个东西的不同称呼。


GCC导出DLL示例

代码:

/* src_demo.c */
#include <stdio.h>
extern char * test(void);
int main(void)
{
    printf("%sn", test());
    return 0;
}
/* dll_demo.c */
char * test(void)
{
    char * str = "Dynamic Link Library Test Successful.";
    return str;
}

命令:

gcc -shared -o dll_demo.dll dll_demo.c
gcc -o demo.exe src_demo.c dll_demo.dll

结果:

b28148b8b477b16492c81142889f74b7.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当然可以!以下是一个示例代码,展示了如何将上述的 DX11 关闭渲染的源码封装一个 DLL 文件: ```cpp #include <Windows.h> #include <d3d11.h> // 导出函数声明 extern "C" __declspec(dllexport) void StopRendering(); LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); // 全局变量 HWND g_hWnd; ID3D11Device* g_pDevice = nullptr; ID3D11DeviceContext* g_pDeviceContext = nullptr; IDXGISwapChain* g_pSwapChain = nullptr; extern "C" __declspec(dllexport) void StopRendering() { // 停止渲染循环 PostMessage(g_hWnd, WM_CLOSE, 0, 0); } BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: // 创建窗口 WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, WindowProc, 0L, 0L, GetModuleHandle(NULL), NULL, NULL, NULL, NULL, _T("DX11App"), NULL }; RegisterClassEx(&wc); g_hWnd = CreateWindow(wc.lpszClassName, _T("DX11 Application"), WS_OVERLAPPEDWINDOW, 100, 100, 800, 600, NULL, NULL, wc.hInstance, NULL); // 初始化 DirectX 设备和交换链 DXGI_SWAP_CHAIN_DESC swapChainDesc = { 0 }; swapChainDesc.BufferCount = 1; swapChainDesc.BufferDesc.Width = 800; swapChainDesc.BufferDesc.Height = 600; swapChainDesc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; swapChainDesc.OutputWindow = g_hWnd; swapChainDesc.SampleDesc.Count = 1; swapChainDesc.Windowed = TRUE; D3D11CreateDeviceAndSwapChain(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, 0, NULL, 0, D3D11_SDK_VERSION, &swapChainDesc, &g_pSwapChain, &g_pDevice, NULL, &g_pDeviceContext); // 创建渲染目标视图 ID3D11RenderTargetView* pRenderTargetView = nullptr; ID3D11Texture2D* pBackBuffer = nullptr; g_pSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID*)&pBackBuffer); g_pDevice->CreateRenderTargetView(pBackBuffer, NULL, &pRenderTargetView); pBackBuffer->Release(); // 渲染循环 MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); // 清空渲染目标视图 float clearColor[4] = { 0.0f, 0.0f, 0.0f, 0.0f }; // RGBA颜色,这里设置为透明色 g_pDeviceContext->ClearRenderTargetView(pRenderTargetView, clearColor); // 呈现到屏幕 g_pSwapChain->Present(0, 0); } // 释放资源 pRenderTargetView->Release(); g_pDeviceContext->Release(); g_pSwapChain->Release(); g_pDevice->Release(); // 销毁窗口 DestroyWindow(g_hWnd); UnregisterClass(wc.lpszClassName, wc.hInstance); break; } return TRUE; } LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_DESTROY: PostQuitMessage(0); return 0; } return DefWindowProc(hWnd, message, wParam, lParam); } ``` 在这个例子中,我们在 DLL 的入口函数 `DllMain` 中创建了一个窗口,并进行了 DirectX 11 的初始化和渲染。然后,在 `StopRendering` 函数中,我们通过发送 `WM_CLOSE` 消息来停止渲染循环。 你可以将这段代码保存为一个名为 "dx11render.dll" 的文件,并在其他程序中加载和调用DLL 来实现关闭渲染的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值