2012-07-10 46 views
3

我想寫爲InpOut32 library的C綁定。在D中使用windows lib的正確方法?

首先,我爲此庫下載了binaries

中有三個文件在裏面:

  • inpout32.lib
  • inpout32.h
  • inpout32.dll

這裏就是我試圖讓d使用此庫。

//io.d 

extern(C) 
{ 
    void Out32(short PortAddress, short data); 
    short Inp32(short PortAddress); 
} 

// test.d 

import std.stdio; 
import io; 

// parallel port address 
short port = 0x0378; 

void main() 
{ 
    /* data */ 
    short data = 0b_00000000; 
    Out32(port, data); 
} 

編譯: DMD -c test.d io.d 結果:全成

鏈接:鏈接test.obj io.obj inpout32.lib

但是,當我嘗試鏈接我得到這個鏈接器錯誤:

OPTLINK (R) for Win32 Release 8.00.12 Copyright (C) Digital Mars

1989-2010 All rights reserved.

http://www.digitalmars.com/ctg/optlink.html inpout32.lib Offset 00000H

Record Type 0021 Error 138: Module or Dictionary corrupt

庫文件可能是COFF格式。我認爲​​工具是不是免費的,所以我用Borland的coff2omf工具OMF format.After轉換我仍然得到鏈接錯誤是這樣的:

OPTLINK (R) for Win32 Release 8.00.12

Copyright (C) Digital Mars 1989-2010 All rights reserved.

http://www.digitalmars.com/ctg/optlink.html

test.obj(test) Error 42: Symbol Undefined _Out32

任何想法如何使用這個LIB?謝謝..


更新: 我今天看了一個關於interesting article爲d的編程語言創建綁定C庫。

現在test.exe按預期工作。到目前爲止我已經完成了這些步驟。

編譯: DMD -c -g test.d io.d

感謝Ali Çehreli用於提-g選項。加入-g標誌後access violation errors消失。

生成OMF導入庫: IMPLIB -a inpout32.lib inpout32.dll

鏈接:鏈接test.obj io.obj inpout32.lib

這一點,我想嘗試一下之後手動加載DLL的。感謝您花時間回答,每個人!

+0

搜索coff2omf我認爲 – Mehrdad 2012-07-10 22:01:16

回答

2

您可能需要擺弄coff2omf或類似工具關於前導_字符的標誌(檢查lib文件以確保符號包含它們)。

或者,您可能更容易使用implib實用程序直接從.dll生成OMF導入庫。

最後,如果您只需要使用少量函數,則使用LoadLibrary動態加載DLL並使用GetProcAddress獲取函數的地址將避免使用.lib文件造成的所有麻煩。

+0

我終於設法鏈接使用工具從DLL中提取鏈接庫。這是你在上面提到的implib工具,我認爲。爲了提取庫,我使用了Borland的_implib_工具和-a選項:'implib -a inpout32.lib inpout32.dll',然後最終將它與'link test.obj io.obj inpout32.lib'聯繫起來執行程序後,我發現我仍然可以得到「訪問衝突」錯誤。我不知道這是所有Window7控制檯應用程序的情況,但它使用以下命令運行良好:'Runas/user:Erdem test.exe'非常感謝您的幫助:) – Erdem 2012-07-11 16:04:13

相關問題