VB.net app 移植64位Win7 时的一个异常

VB.net app 移植64位Win7 时的一个错误本帖最后由 first_cuit 于 2012-08-31 16:37:03 编辑跪求高手!!!!!!

VB.net app 移植64位Win7 时的一个错误
本帖最后由 first_cuit 于 2012-08-31 16:37:03 编辑 跪求高手!!!!!!

问题概述:
Win7 64位可兼容32位应用程序,安装在program(x86)下,鄙人开发了一个32位的VB.NET 的桌面应用程序,拷贝到win7的program(x86)报错。
错误描述: 应用程序使用动态库里面的方法时出错。(就像没有加载到那个动态库一样,经证所有调用该动态库的方法都会报这个错。动态库我自己写的。)

开发环境:OS 是win2003,IDE 工具是VS2008。 工程是VB.NET 窗口程序。

关键代码:
 

Private Declare Function AAPI_AppendToList Lib "hapi32" Alias "_AAPI_AppendToList@16" (ByVal AAPIhandle As Integer, ByVal pList As String, ByVal buffer As String, ByVal clearflag As Integer) As Integer
 Private Declare Function AAPI_OpenSession Lib "hapi32" Alias "_AAPI_OpenSession@12" (ByVal host As String, ByVal username As String, ByVal password As String) As Integer
     Public Function WP_OpenSession(ByVal host As String, ByVal username As String, ByVal password As String) As Integer
        Dim status As Integer

        status = AAPI_OpenSession(host, username, password)
        WP_OpenSession = status
    End Function   

 定义 AAPI_AppendToList 方法,该方法是 hapi32.dll 中的_AAPI_AppendToList@16方法。还定义了很多类似的方法,这里就不贴出来了。
在程序里面只要一调用动态库中得方法就会报错,win7就会弹出这个错,见 details:
See the end of this message for details on invoking 
just-in-time (JIT) debugging instead of this dialog box.

************** Exception Text **************
System.BadImageFormatException: An attempt was made to load a program with an incorrect format. (Exception from HRESULT: 0x8007000B)
   at RR.WPVB.AAPI_OpenSession(String& host, String& username, String& password)
   at RR.WPVB.WP_OpenSession(String host, String username, String password)
   at RR.Form_ViewWBS.Form1_Load(Object sender, EventArgs e)
   at System.EventHandler.Invoke(Object sender, EventArgs e)
   at System.Windows.Forms.Form.OnLoad(EventArgs e)
   at System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
   at System.Windows.Forms.Control.CreateControl()
   at System.Windows.Forms.Control.WmShowWindow(Message& m)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

我写了一个delphi的demo。
function AAPI_AppendToList(aapihandle: integer; plist, buffer: pchar;
                           clearflag: integer): integer; external 'HAPI16.DLL' ;
    function AAPI_OpenSession(name, param1, param2: pchar): integer;
         external 'HAPI16.DLL' ;


function WP_OpenSession(Host, UserName, Password: string): integer;
var
  p1, p2, p3: pchar;
begin
  p1:=Allocmem(length(Host)+1);
  StrPCopy(p1,Host);
  p2:=Allocmem(length(UserName)+1);
  StrPCopy(p2,UserName);
  p3:=Allocmem(length(Password)+1);
  StrPCopy(p3,Password);
  result := aapi_opensession(p1,p2,p3);
  hsession := result;
  freemem(p1,length(Host)+1);
  freemem(p2,length(UserName)+1);
  freemem(p3,length(Password)+1);
end;


同样的调用,在delphi中不会报这个错误。

跪求高手帮助分析一下原因。谢谢!
[最优解释]
BadImageFormatException说明Build的目标平台和运行平台不同。

你在哪个平台上Build的程序,如果是在Win7下面的话,将目标平台设定为X86,重新Build一下看看,因为你调用的是32位(X86)下的Dll。

[其他解释]
补充一下,这个程序是在win2003上开发的,直接copy到win7 32bit上运行完全正常。copy到win7 64的program(x86)路劲下报的这个错误。感觉不像是代码的问题。求高手帮助
[其他解释]
引用:
BadImageFormatException说明Build的目标平台和运行平台不同。

你在哪个平台上Build的程序,如果是在Win7下面的话,将目标平台设定为X86,重新Build一下看看,因为你调用的是32位(X86)下的Dll。


就是这个问题,我之前build的时候没有选择x86,选的默认的,导致了win7 不能识别我的exe是32位的,同样按照64位的来处理的,所以报错了。问题已经解决了,就是重新build一下,选x86
[其他解释]
解决了