使用如下代码调用DllWinMain函数,来是提示非法程序调用#include "stdafx.h"
#include "windows.h"int _tmain(int argc, _TCHAR* argv[])
{
typedef int * (*DllWinMain)(char *  ,int);
    HMODULE h = LoadLibraryA("vfp9r.dll");
DllWinMain vfpproc = (DllWinMain)GetProcAddress(h, "DllWinMain");
printf("%dhandle%d" ,h,vfpproc);
    vfpproc("test.app" ,255);
FreeLibrary(h);
return 0;
}
在vfp中使用调用window api的方式则成功
下面是vfp9的代码
declare long DllWinMain in vfp9r.dll string sApp ,long nPara
DllWinMain("test.app" ,255)
先谢谢了

解决方案 »

  1.   

    LoadLibraryA()本身就会调用DllMain..
    加载dll成功后,直接调用dll导出的test函数
      

  2.   

    Unhandled exception at 0x775c3b3d in asm.exe: 0xC0000005: Access violation writing location 0x00360ffc.775C3B2B  cmp         byte ptr [ebp-21h],0 
    775C3B2F  jne         775D28AB 
    775C3B35  ret              
    775C3B36  mov         edx,dword ptr [ebp+0Ch] 
    775C3B39  lea         eax,[ebp-10h] 
    775C3B3C  push        eax  
    775C3B3D  push        esi  ;执行到这里
    775C3B3E  push        dword ptr [ebp-8] 
    775C3B41  or          edx,2 
    775C3B44  push        dword ptr [ebp+10h] 
    775C3B47  mov         ecx,ebx 
    775C3B49  call        775C375D 
    775C3B4E  mov         edi,eax 
    775C3B50  jmp         775BDF86 
    775C3B55  mov         dword ptr [ebp-0C0h],edi 
    775C3B5B  mov         eax,dword ptr [edi+4] 
    775C3B5E  mov         ecx,dword ptr [ebp-2Ch] 
    775C3B61  cmp         ecx,eax 
    775C3B63  jae         775C2A42 
    775C3B69  mov         dword ptr [ebp-84h],ecx 
    775C3B6F  mov         dword ptr [ebp-9Ch],edi 
    775C3B75  mov         ecx,dword ptr [ebp-84h] 
    775C3B7B  sub         ecx,dword ptr [edi+14h] 
    775C3B7E  mov         edx,dword ptr [edi+18h] 
    775C3B81  mov         dword ptr [ebp+10h],edx 
    775C3B84  mov         eax,dword ptr [edx+4] 
    775C3B87  mov         dword ptr [ebp-94h],eax 
    775C3B8D  cmp         edx,eax 
    775C3B8F  je          775CFE62 堆栈信息> ntdll.dll!775c3b3d() 
      [Frames below may be incorrect and/or missing, no symbols loaded for ntdll.dll]
      ntdll.dll!775c3b4e() 
      ntdll.dll!775bf46c() 
      vfp9r.dll!0c1d996d() 
      vfp9r.dll!0c1d99cc() 
      vfp9r.dll!0c123c10() 
      msvcr71.dll!7c34246e() 
      ntdll.dll!775e87b9() 
      ntdll.dll!775e878b() 
      ntdll.dll!775e872e() 
      ntdll.dll!775a010f() 
      

  3.   

    vfpproc("test.app" ,255);
    test.app没有全路径
      

  4.   

    test.app跟执行程序同一个目录我试过带绝对路径 ,但是一样。改成以下这样
    vfpproc("" ,255);则vfp弹出个选择app,fxp,exe等各种类型文件的对话框,这时选择了,能运行。
    但是运行后还是会出现下面的错误Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call.  This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.
      

  5.   

    函数调用约定不一致,你的dll估计是__stdcall,把你工程属性中的C++->Advanced->Calling Convernsion
      

  6.   

    dllmain并不是一个导出函数。在dll编译后就是一个内部函数。
    如果需要导出此函数,可以用export命令。
      

  7.   


    DllWinMain这个函数是vfp9r.dll的导出函数来的。
    DllMain才是dll的入口点。
      

  8.   


    多谢提醒。改成stdcall以后
    执行vfpproc("" ,255);这行后不会出现错误了。但是执行
    vfpproc("test.app" ,255);依然是有错误。我猜测是不是第一个参数传入有些问题。不知道怎么去试。
      

  9.   

    你要看dll对应的导出函数名称...然后调用,用depends查看一下
      

  10.   

    非常感谢。问题解决了。一个是stdcall的原因一个是字符串的问题。