当前位置:编程学习 > C#/ASP.NET >>

LoadLibrary失败

将自己写的DLL加载编译没问题执行时有错误
於 0x00000000 的 RunTimeLoad.exe 中發生未處理的例外狀況: 0xC0000005: 讀取位置 0x00000000 時發生存取違規。
请问是什么问题啊

#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <iostream>
using std::cout;

typedef void (_stdcall *LOADPROC)(void);

int main()
{
LOADPROC load;
HINSTANCE hDll = LoadLibraryEx("LoadDLL.dll", NULL, 1);

if (hDll == NULL)
{
cout<<"The DLL do not load!\n";
exit(1);
}

load = (LOADPROC)GetProcAddress(hDll, "Loading");

load();

FreeLibrary(hDll);

return 0;
} --------------------编程问答-------------------- 发现LoadLibarary没问题, 但GetProcAddress没抓到函数

#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <iostream>
using std::cout;

typedef void (_stdcall *LOADPROC)(void);

int main()
{
LOADPROC load;
HINSTANCE hDll = LoadLibraryEx("LoadDLL.dll", NULL, 1);

if (hDll == NULL)
{
cout<<"The DLL do not load!\n";
exit(1);
}

load = (LOADPROC)GetProcAddress(hDll, "Loading");

if (load != NULL)
load();
else
{
cout<<"Can not find the function!";
exit(1);
}

FreeLibrary(hDll);

return 0;
}

结果 Can not find the function!

DLL档案如下

LoadDLL.h

#ifdef LoadDLL_EXPORTS
#define LoadDLL_API _declspec(dllexport)
#else
#define LoadDLL_API _declspec(dllimport)
#endif

class LoadDLL_API CPrint
{
public:
CPrint();
void Loading();
private:
int count;
};

LoadDLL.cpp

#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <iostream>
#include "LoadDLL.h"
using std::cout;

BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
return TRUE;
}

CPrint::CPrint()
{

}

void CPrint::Loading()
{
count = 10;
cout<<"Dynamic Load DLL\n";
cout<<"Loading....\n";
Sleep(500);
cout<<"Carry out!\n";
cout<<"Count is : "<<count<<"\n";
}

LoadDLL.def

LIBRARY LoadDLL

EXPORT
Loading @1

有高手可以帮我解答吗,谢谢 --------------------编程问答-------------------- HMODULE LoadLibraryEx(
  LPCTSTR lpFileName,
  HANDLE hFile,
  DWORD dwFlags
);

Parameters
lpFileName 
[in] Pointer to a null-terminated string that names the executable module (either a .dll or an .exe file). The name specified is the file name of the executable module. This name is not related to the name stored in a library module itself, as specified by the LIBRARY keyword in the module-definition (.def) file. 
If the string specifies a path, but the file does not exist in the specified directory, the function fails. When specifying a path, be sure to use backslashes (\), not forward slashes (/).

If the string does not specify a path, and the file name extension is omitted, the function appends the default library extension .dll to the file name. However, the file name string can include a trailing point character (.) to indicate that the module name has no extension.

If the string does not specify a path, the function uses a standard search strategy to find the file. See the Remarks for more information.

If mapping the specified module into the address space causes the system to map in other, associated executable modules, the function can use either the standard search strategy or an alternate search strategy to find those modules. See the Remarks for more information.

hFile 
This parameter is reserved for future use. It must be NULL. 
dwFlags 
[in] Action to take when loading the module. If no flags are specified, the behavior of this function is identical to that of the LoadLibrary function. This parameter can be one of the following values. Value Meaning 
DONT_RESOLVE_DLL_REFERENCES If this value is used, and the executable module is a DLL, the system does not call DllMain for process and thread initialization and termination. Also, the system does not load additional executable modules that are referenced by the specified module. 
If this value is not used, and the executable module is a DLL, the system calls DllMain for process and thread initialization and termination. The system loads additional executable modules that are referenced by the specified module.

Example Code 
For an example, see Looking Up Text for Error Code Numbers.

Windows XP, Windows 2000, and Windows NT, it is sometimes necessary to display error text associated with error codes returned from networking-related functions. You may need to perform this task with the network management functions provided by the system.


The error text for these messages is found in the message table file named Netmsg.dll, which is found in %systemroot%\system32. This file contains error messages in the range NERR_BASE (2100) through MAX_NERR(NERR_BASE+899). These error codes are defined in the SDK header file lmerr.h.

The LoadLibrary and LoadLibraryEx functions can load Netmsg.dll. The FormatMessage function maps an error code to message text, given a module handle to the Netmsg.dll file.

The following sample illustrates how to display error text associated with network management functions, in addition to displaying error text associated with system-related error codes. If the supplied error number is in a specific range, the netmsg.dll message module is loaded and used to look up the specified error number with the FormatMessage function.

#include <windows.h>
#include <stdio.h>

#include <lmerr.h>

void
DisplayErrorText(
    DWORD dwLastError
    );

#define RTN_OK 0
#define RTN_USAGE 1
#define RTN_ERROR 13

int
__cdecl
main(
    int argc,
    char *argv[]
    )
{
    if(argc != 2) {
        fprintf(stderr,"Usage: %s <error number>\n", argv[0]);
        return RTN_USAGE;
    }

    DisplayErrorText( atoi(argv[1]) );

    return RTN_OK;
}

void
DisplayErrorText(
    DWORD dwLastError
    )
{
    HMODULE hModule = NULL; // default to system source
    LPSTR MessageBuffer;
    DWORD dwBufferLength;

    DWORD dwFormatFlags = FORMAT_MESSAGE_ALLOCATE_BUFFER |
        FORMAT_MESSAGE_IGNORE_INSERTS |
        FORMAT_MESSAGE_FROM_SYSTEM ;

    //
    // If dwLastError is in the network range, 
    //  load the message source.
    //

    if(dwLastError >= NERR_BASE && dwLastError <= MAX_NERR) {
        hModule = LoadLibraryEx(
            TEXT("netmsg.dll"),
            NULL,
            LOAD_LIBRARY_AS_DATAFILE
            );

        if(hModule != NULL)
            dwFormatFlags |= FORMAT_MESSAGE_FROM_HMODULE;
    }

    //
    // Call FormatMessage() to allow for message 
    //  text to be acquired from the system 
    //  or from the supplied module handle.
    //

    if(dwBufferLength = FormatMessageA(
        dwFormatFlags,
        hModule, // module to get message from (NULL == system)
        dwLastError,
        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // default language
        (LPSTR) &MessageBuffer,
        0,
        NULL
        ))
    {
        DWORD dwBytesWritten;

        //
        // Output message string on stderr.
        //
        WriteFile(
            GetStdHandle(STD_ERROR_HANDLE),
            MessageBuffer,
            dwBufferLength,
            &dwBytesWritten,
            NULL
            );

        //
        // Free the buffer allocated by the system.
        //
        LocalFree(MessageBuffer);
    }

    //
    // If we loaded a message source, unload it.
    //
    if(hModule != NULL)
        FreeLibrary(hModule);
}
After you compile this program, you can insert the error code number as an argument and the program will display the text. For example:


--------------------编程问答-------------------- MSDN上的例子自己看吧
补充:.NET技术 ,  VC.NET
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,