2011-06-11 33 views
4

我剛遇到一個奇怪的問題。我試圖加載一個模型到OpenGL,並在我加載紋理的部分使用auxDIBImageLoadA(dibfile:PWideChar)函數。這裏是我的代碼調用它帶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"的框。好的。但後來我得到一個錯誤,說"Failed to open DIB file F"。當我將stFileName設置爲xFACE.BMP時,我得到"Failed to open DIB file x"。因此,出於某種原因,該函數似乎只取第一個字符。

我錯過了什麼嗎?我使用的glaux.dll是我從不同來源下載的5次,所以它應該沒有問題(我希望每個OpenGL站點都提到它)。

+1

WideChar' 'F''表示爲兩個AnsiChars'' F」,#0' Unicode版本,和你在這裏,截斷字符串 – 2011-06-11 17:36:03

+0

總是寫你的delphi版本。 – 2011-06-12 03:03:33

+0

對。這是XE。 – 2011-06-12 07:59:33

回答

7

這很奇怪,以「A」結尾的函數通常需要PAnsiChar指針,而以「W」結尾的函數需要PWideChar指針。還有auxDIBImageLoadW電話嗎?如果使用那個,或者嘗試使用PAnsiChar,由於您傳遞的PWideChar(每個位置兩個字節)看起來像一個字符長度的字符串,如果它被評估爲1個字節的字符串。

+0

該功能需要PChar。至少在我找到的單位中沒有其他選擇。另外,這個例子適用於Delphi7,我有Delphi XE,並且出現錯誤是因爲有MessageBox(..,PAnsiChar)調用,而Delphi XE知道'MessageBox(..,PWideChar)'。調用'MessageBox(PWidechar(pansicharparam))'好嗎? – 2011-06-11 10:51:49

+0

我認爲MessageBoxA和MessageBoxW也存在。這是'通常'有一個函數調用聲明,沒有後綴,依賴於'平臺標準'(在Delphi 2006或更改版本中進行了更改)中的一個,但我建議選擇AnsiChar/WideChar和A/W後綴全部避免混淆的方法。 – 2011-06-11 10:58:12

+0

太棒了!我下載了一個寫得不好的GLaux.pas文件,因此我搜索了「原始」C++並找到了'auxDIBImageLoadW'函數並將其寫入.pas。它現在就像一種魅力,謝謝。但是,如何將PWideChar轉換成PAnsiChar或反之亦然呢? – 2011-06-11 11:03:57

1

您需要將您的Unicode字符串轉換爲ANSI。像這樣做

pBitmap := auxDIBImageLoadA (PAnsiChar(AnsiString(strFileName))) 

你會好起來叫雖然

pBitmap := auxDIBImageLoadW (PWideChar(strFileName)) 
相關問題