String PWideChar参数仅取第一个字符的函数

String PWideChar参数仅取第一个字符的函数,string,delphi,opengl,pointers,char,String,Delphi,Opengl,Pointers,Char,我刚刚遇到了一个奇怪的问题。我正在尝试将模型加载到OpenGL,在加载纹理的部分,我使用了auxDIBImageLoadA(dibfile:PWideChar)函数。这是我调用它的代码 procedure CreateTexture(var textureArray: array of UINT; strFileName: string; textureID: integer); // Vytvožení textury var pBitmap: PTAUX_RGBImageRe

我刚刚遇到了一个奇怪的问题。我正在尝试将模型加载到OpenGL,在加载纹理的部分,我使用了
auxDIBImageLoadA(dibfile:PWideChar)
函数。这是我调用它的代码

procedure CreateTexture(var textureArray: array of UINT; strFileName: string; textureID: integer);       // Vytvožení textury
var
  pBitmap: PTAUX_RGBImageRec;                                                   
begin
  if strFileName = '' then exit;                                                
  MessageBox(0,PWideChar(strFileName),nil,SW_SHOWNORMAL);
  pBitmap := auxDIBImageLoadA(PWideChar(strFileName));      
  if pBitmap = nil then exit;    
...
MessageBox仅用于控制。事情就是这样:我运行应用程序时,会出现一个带有
“FACE.BMP”
的框。可以但是我得到一个错误,说
“无法打开DIB文件F”
。当我将
stFileName
设置为
xFACE.BMP
时,我得到一个
“无法打开DIB文件x”
。因此,出于某种原因,函数似乎只接受第一个字符


我错过什么了吗?我正在使用glaux.dll,我从不同的来源下载了5次,所以它应该是没有bug的(我希望,每个OpenGL站点都会引用它)

这很奇怪,以“A”结尾的函数通常采用泛七边形指针,而以“W”结尾的函数则采用PWideChar指针。是否也有
auxDIBImageLoadW
呼叫?如果有,请使用该字符串,或者尝试使用PAnsiChar,因为您传递的PWideChar(每个位置两个字节)如果计算为1字节字符串,则看起来像一个一个字符长的字符串。

您需要将Unicode字符串转换为ANSI。像这样做

pBitmap := auxDIBImageLoadA (PAnsiChar(AnsiString(strFileName)))
不过,最好还是调用Unicode版本

pBitmap := auxDIBImageLoadW (PWideChar(strFileName))

该函数采用PChar。没有其他选择,至少在我找到的单元中。另外,这个例子是针对Delphi7的,我有Delphi XE,我得到了错误,因为有对
MessageBox(..,PAnsiChar)
的调用,而Delphi XE知道
MessageBox(..,PWideChar)
。调用MessageBox(PWidechar(pansicharparam))可以吗?我认为MessageBoxA和MessageBoxW也存在。通常,函数调用声明不带后缀,根据“平台标准”(在Delphi 2006或其他版本中有所改变)转发到两者之一,但我建议选择AnsiChar/WideChar和a/W后缀,以避免混淆。太好了!我下载了一个写得很差的GalOx.pas文件,所以我搜索了“原始”C++,找到了<代码> AudidibIpLeLoADW函数并将其写入.PAS。谢谢你,它现在很有魅力。但是,怎样才能将PWideChar转换为PAnsiChar,或者将PWideChar转换为PAnsiChar呢?通常情况下,PAnsiChar(AnsiString(MyWideTring1))应该可以工作,反之亦然versa@MagicMaster,它不一定写得很糟糕。它可能只是在德尔福2009年之前。当时没有办法确定PChar会成为PWideChar.WideChar的别名,表示为两个Ansichar
'F',#0
,在这里,请始终编写您的delphi版本。