{------------------------------------}
{过程名:DLL入口函数
过程功能:进行DLL初始化,释放等
过程参数:DLL状态}
{------------------------------------}
procedure DLLEntryPoint(Reason:integer);
begin
case Reason of
  DLL_PROCESS_ATTACH:OpenShareData ;
  DLL_PROCESS_DETACH:CloseShareData ;
end;
end;{------------------------------------}
{过程名:打开数据共享
过程功能:建立映象文件
过程参数:无}
{------------------------------------}
procedure OpenShareData;
begin
  MapHandle:=CreateFileMapping($FFFFFFFF,
                               nil,
                               PAGE_READWRITE,
                               0,
                               $ffff,
                               'MyMap');
  if MapHandle<>0 then
  begin
    Buffer:=MapViewOfFile(MapHandle,FILE_MAP_ALL_ACCESS,0,0,0);
    if Buffer=nil then
      CloseHandle(MapHandle);
  end
  else if GetLastError = ERROR_ALREADY_EXISTS then
  begin
    MapHandle := OpenFileMapping(FILE_MAP_ALL_ACCESS, False, 'MyMap');
    if MapHandle = 0 then
      Exit;
  end
  else
    Exit;
end;
请高手们帮忙看看,这段代码中哪里导致非法访问内存??如何修改?DLLProc已经指向DLLEntryPoint进程的地址。

解决方案 »

  1.   

    HANDLE CreateFileMapping(
      HANDLE hFile,              // handle to file to map
      LPSECURITY_ATTRIBUTES lpFileMappingAttributes,
                                 // optional security attributes
      DWORD flProtect,           // protection for mapping object
      DWORD dwMaximumSizeHigh,   // high-order 32 bits of object size
      DWORD dwMaximumSizeLow,    // low-order 32 bits of object size
      LPCTSTR lpName             // name of file-mapping object
    );
    // 这个函数调用好像没错..LPVOID MapViewOfFile(
      HANDLE hFileMappingObject,  // file-mapping object to map into 
                                  // address space
      DWORD dwDesiredAccess,      // access mode
      DWORD dwFileOffsetHigh,     // high-order 32 bits of file offset
      DWORD dwFileOffsetLow,      // low-order 32 bits of file offset
      DWORD dwNumberOfBytesToMap  // number of bytes to map
    );
    // 也正确...函数调用没有问题...你把这些函数拷贝到本工程调用试试 看是不是调用DLL的问题
      

  2.   

    在其他工程中做没问题。
    Fun:function(......):integer;StdCall;Module:=LoadLibrary('xx.dll');
    @fun:=GetProcAddress(Module,'export_function');
    调用函数;
    Freelibrary(Moudle);
      

  3.   

    你上面这样做OK么?
    一般 是定义一个函数指针 然后再
    Module:=LoadLibrary('xx.dll');
    if Module > 0 then
    begin
      pfun := GetProcAddress(Module,'export_function');
    end;...........
      

  4.   

    呵呵,简写……是Load时候出的问题,Load之后的if还没执行就非法访问了。所以我觉的是入口哪里写错了。
      

  5.   

    Buffer:=MapViewOfFile(MapHandle,FILE_MAP_ALL_ACCESS,0,0,0);是不是这出问题?MapViewOfFile返回的地址对指针类型有要求吗?
      

  6.   

    LPVOID MapViewOfFile(
      HANDLE hFileMappingObject,  // file-mapping object to map into 
                                  // address space
      DWORD dwDesiredAccess,      // access mode
      DWORD dwFileOffsetHigh,     // high-order 32 bits of file offset
      DWORD dwFileOffsetLow,      // low-order 32 bits of file offset
      DWORD dwNumberOfBytesToMap  // number of bytes to map
    );
    // 应该没错
    你在每个API函数后都调用一下GetLastError看看里面的错误代码即可
      

  7.   

    问题是Load的时候就错了,后边的GetLastError根本执行不了。