win32编程如何调用另一个程序或者dll…不要刚说一个函数,具体呢

win32编程如何调用另一个程序或者dll…不要刚说一个函数,具体呢,第1张

运行另一个程序的话,有很多办法,比如 ShellExecute,WinExec,CreateProcess 等

调用另一个 dll,有静态调用和动态调用两种

静态调用就是在代码里 include 头文件,包含函数定义,并且链接 dll 的 lib 文件,然后直接使用即可,编译器会自动链接这个 dll,但是如果 dll 找不到,那么程序数斗会无法启动

所以对于不确定 dll 是否可以正常使用时,需要使用动态调用

首先需要使用 LoadLibrary 函数

HMODULE WINAPI LoadLibrary(

  _In_  LPCTSTR lpFileName

)

成功载入 dll 之后,再使用 GetProcAddress 函数获取 要使用的函数的地址

FARPROC WINAPI GetProcAddress(

  _In_  HMODULE hModule,

  _In_  LPCSTR lpProcName

)

然后就可以使用了,不需要的时候可以使用 FreeLibrary 释放 dll 内存

BOOL WINAPI FreeLibrary(

  _In_  HMODULE hModule

)

下面死是 MSDN 给出的例子作为参考

// A simple program that uses LoadLibrary and 

// GetProcAddress to access myPuts from Myputs.dll. 

 

#include <windows.h> 

#include <stdio.h> 

 

typedef int (__cdecl *MYPROC)(LPWSTR) 

 

int main( void ) 

    HINSTANCE hinstLib 

    MYPROC ProcAdd 

    BOOL fFreeResult, fRunTimeLinkSuccess = FALSE 

 

    // Get a handle to the DLL module.

    hinstLib = LoadLibrary(TEXT("MyPuts.dll")) 

 

    // If the handle is valid, try to get the function address.

 早带   if (hinstLib != NULL) 

    { 

        ProcAdd = (MYPROC) GetProcAddress(hinstLib, "myPuts") 

 

        // If the function address is valid, call the function.

        if (NULL != ProcAdd) 

        {

            fRunTimeLinkSuccess = TRUE

            (ProcAdd) (L"Message sent to the DLL function\n") 

        陆毕芦}

        // Free the DLL module.

        fFreeResult = FreeLibrary(hinstLib) 

    }

    // If unable to call the DLL function, use an alternative.

    if (! fRunTimeLinkSuccess) 

        printf("Message printed from executable\n")

    return 0

}

解决方法如下:

1、解压下载的文件;

2、复颤基制文件“msvcrtd.dll”到系统目录下;

3、系统目录一般为:C:\漏液WINNT\System32 (注意:64位系统为C:\Windows\SysWOW64);

4、最后点击开始菜单-->运行-->输入regsvr32 msvcrtd.dll后,回车即可解决错误提茄搜谨示;

msvcrtd.dll丢失的界面:

如果你使用的是VISUAL STUDIO

1、从“文掘备件”菜单中,选择“新建”,然后选择“项目…”。

2、从“项目类型”窗格中选择“Visual C++”下的“Win32”。

3、从“模板”窗格中,选择“Win32 控制台应用程序”。

4、为项目选择一个名称,如“MathFuncsDll”,并将其输入“名称”字段。为解决方案选择一个名称,如“DynamicLibrary”,并将其输入“解档孝决方案名称”字段。

5、按“确定”启动 Win32 应用程序向导。在“Win32 应用程序向导”对话框的“概述”页中,按“下一步”。

6、从“Win32 应用程序向导”中的“应用程序设置”页中,选择“应用程序类型”下的“DLL”(如果可用),或者选择“控制台应用程序”(如果“DLL”不可用)。某些版本的 Visual Studio 不支持使用向导创建 DLL 项目。您可以稍后对此进行更改,以将项目编译为 DLL。

7、从“Win32 应用程序向导”的“应用程序设置”页中,选择“附加选项”下的“空项目”。

VC6.0下

1、编写非MFC的DLL库

(1) VC6.0下建立Win32 Dynalmic-Link Library工程mydll。

(2)工程下创建一个mydll.h头文件和mydll.cpp实现文件。

mydll.h头文件如下:

#ifndef MYDLL_H#define MYDLL_H

#ifdef DLL#define EXTERN extern "C" _declspec(dllexport)#else#define EXTERN extern "C" _declspec(dllimport)#endif

EXTERN int myadd(int, int)

#endif

mydll.cpp实现文件如下:

#define DLL#include "mydll.h"

int myadd(int a, int b){ return a+b}

(3)编译生成DLL动态库mydll.dll

2、创建一个调用DLL库的应用程序testapp

(1)在VC6.0下建立Win32 Console Application工程,在下一步选择简单应用程序。

(2)修改testapp.cpp文件,行散稿实现调用mydll.dll动态库中的函数myadd。实现如下:

#include "stdafx.h"#include <stdio.h>#include <windows.h>typedef int (*padd)(int, int)

int main(int argc, char* argv[]){ HINSTANCE handle = ::LoadLibrary("../../mydll/debug/mydll.dll")//mydll.dll动态库路径 if(handle != NULL) { padd pf = (padd)GetProcAddress(handle,"myadd") if(pf != NULL) { printf("dll myadd(3,2) = %d", pf(3,2)) }

::FreeLibrary(handle)

} return 0}

(3)编译生成exe应用程序testapp.exe。

(4)运行testapp.exe,结果如下:

dll myadd(3,2) = 5


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/12315846.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存