我无法使用64位版本的bass.dll运行我的64位Delphi应用程序.我正在使用Delphi XE3来构建我的应用程序.
应用程序崩溃开始0xc000007b
.调试器消息:
Thread Start: Thread ID: 7692. Process Project1.exe (7444) Process Start: D:\svn\preplayer\Project1.exe. Base Address: $0000000076DBC500. Process Project1.exe (7444) Module Load: Project1. Has Debug Info. Base Address: $0000000000400000. Process Project1.exe (7444) Module Load: ntdll.dll. No Debug Info. Base Address: $0000000076D90000. Process Project1.exe (7444) Module Load: snxhk64.dll. No Debug Info. Base Address: $0000000070D20000. Process Project1.exe (7444) Module Load: KERNEL32.dll. No Debug Info. Base Address: $00000000766B0000. Process Project1.exe (7444) Module Load: KERNELBASE.dll. No Debug Info. Base Address: …
如何让我的Perl脚本检测到它在64位Windows机器上运行,即使它是32位perl?
Windows API中有一些新的整数类型支持Win64.他们并不总是受到支持; 例如,它们不存在于MSVC6中.
如何编写#if
条件来检测这些类型是否受支持<windows.h>
?
(我的代码需要在许多不同版本的Microsoft Visual C++下编译,包括MSVC6.所以我需要提供我自己的这些类型的定义,#if
并在新的编译器中禁用它们).
(对于搜索者,完整的类型列表是:DWORD_PTR,INT_PTR,LONG_PTR,UINT_PTR,ULONG_PTR)
我正在使用VS2010 Pro编译器,当我在x64上构建时,我得到以下编译错误.在x86上完美编译.错误C2704:'':__va_start内部仅允许在varargs中
方法声明:
int foo(char* buf, int maxChar, const char*& fmt);
Run Code Online (Sandbox Code Playgroud)
定义:
int foo(char* buf, int maxChar, const char*& fmt)
{
int numChar = 0;
if (fmt)
{
va_list plist;
va_start(plist, fmt);
numChar = _vsnprintf(buf, maxChar, fmt, plist);
va_end(plist);
}
return numChar;
}
Run Code Online (Sandbox Code Playgroud)
这个错误是什么意思?如何解决这个问题?
我有一个批处理文件(出于兼容性原因)在32位cmd.exe
进程中运行.但是,在这种情况下,我现在需要启动64位版本的Windows命令行工具msiexec
.我怎样才能做到这一点?
其他细节:
我正在使用批处理文件来安装各种软件产品.为了最大限度地兼容旧产品,批处理文件作为32位进程运行.但是,我现在需要安装Intel Haxm,它需要64位版本msiexec
.
我已经尝试过调用c:\windows\system32\msiexec.exe
,但是在执行此操作时,Windows安装程序日志文件仍然说:
=== Verbose logging started: 14.04.2015 14:27:53 Build type: SHIP UNICODE 5.00.9600.00 Calling process: c:\windows\SysWOW64\msiexec.exe ===
我正在使用64位Windows 8计算机上的Delphi XE3,构建32位和64位应用程序.
我正在使用EnumWindows找出给定其进程ID的进程主窗口的Windows句柄.代码使用回调例程中的LPARAM参数将指针传递给记录.
我正在使用的代码适用于32位版本.
当我编译并运行64位构建时,它失败了.出现此问题的原因是LPARAM值似乎在Wnd参数中传递.Param值总是设置为$ FFFF ...换句话说,我根本没有传递HWND值...所以它不是因为参数只是交换了.
type
PEnumInfo = ^TEnumInfo;
TEnumInfo = record
ProcessID : DWORD;
HWND : THandle;
end;
function EnumWindowsProc(Wnd: HWND; Param : LPARAM): Bool; stdcall;
var
PID : DWORD;
PEI : PEnumInfo;
begin
// in 32-bit Param matches the address of the param that is passed
// in 64-bit Param is set to $FFFF - however Wnd = the expected address
ShowMessage('PEI = '+IntToStr(Param));
PEI := PEnumInfo(Param);
GetWindowThreadProcessID(Wnd, @PID);
// the code fails at this …
Run Code Online (Sandbox Code Playgroud) (这个问题特定于我的机器的架构和调用约定,Windows x86_64)
我不记得我在哪里读过这个,或者我是否正确地回忆过它,但我听说过,当一个函数应该按值返回一些结构或对象时,它会填充它rax
(如果对象可以适合在寄存器宽度为64位)或传递一个指针,指向结果对象将在哪里(我猜测在调用函数的堆栈帧中分配)rcx
,在那里它将执行所有通常的初始化,然后a mov rax, rcx
为返回行程.就是这样的
extern some_struct create_it(); // implemented in assembly
Run Code Online (Sandbox Code Playgroud)
真的会有一个秘密的参数
extern some_struct create_it(some_struct* secret_param_pointing_to_where_i_will_be);
Run Code Online (Sandbox Code Playgroud)
我的记忆是正确的,还是我错了?如何通过函数的值返回大对象(即宽度超过寄存器宽度)?
它似乎是在我创建的每个项目中自动添加的,我为x64编译,但在选择x64配置时,它甚至不会出现在项目的配置属性/(C/C++)/预处理器中.
我有一些只能在32位窗口上运行的matlab代码,但我需要至少6 GB的ram才能运行它.在我的实验室中,唯一拥有6GB RAM的机器运行64位窗口,有没有办法在这里运行此代码?我正在考虑模拟32位窗口并在其上运行它,这会工作吗?
有人请告诉我这有什么意义,以及如何让它停止?说真的,我疯了还是64位Windows长型只有4个字节?这有什么用呢?我认为本机长原始大小应该与本机寄存器大小相同.
[32-bit Linux]
me@u32:~$ ./sizes32
sizeof(char): 1
sizeof(short): 2
sizeof(int): 4
sizeof(long): 4
sizeof(long long): 8
[64-bit Linux]
me@u64:~$ ./sizes64
sizeof(char): 1
sizeof(short): 2
sizeof(int): 4
sizeof(long): 8
sizeof(long long): 8
[32-bit Windows]
C:\Users\me\Downloads>sizes32.exe
sizeof(char): 1
sizeof(short): 2
sizeof(int): 4
sizeof(long): 4
sizeof(long long): 8
[64-bit Windows]
C:\Users\me\Downloads>sizes64.exe
sizeof(char): 1
sizeof(short): 2
sizeof(int): 4
sizeof(long): 4
sizeof(long long): 8
Run Code Online (Sandbox Code Playgroud)