2008-12-03 62 views

回答

2

嗯......恐怕這個問題有點難以理解。

在C++中,結構聲明就是這樣一個聲明。它不會生成您可以在運行時加載的內容,這是一種純粹的編譯時構造,它告訴編譯器內存中如何佈置內容,涉及的字段,類型和順序等。

1

我假設你正在使用VC++ 2005

MS現在爲您提供Delay Loading Dll's

Visual C++鏈接器現在支持DLL的延遲加載。這免除您的需要使用Windows SDK函數LoadLibrary和GetProcAddress來實現DLL延遲加載。

要設置延遲負載的步驟。

轉到到工程 - >屬性 - >連接器 - >輸入,然後指定你的DLL「延遲加載的DLL」

+0

如果他想根據版本和可用性動態加載庫,則仍然必須使用LoadLibrary。 – 2008-12-03 10:28:29

3

你的意思是數據放在一個DLL,使用LoadLibrary和Getprocaddres獲取一個指針數據?這是可能的,儘管在dll中放置函數更常見,並讓它們返回一個指向數據的指針。

8

讓我承擔一些事情,在這個問題排除在外:

  1. 你有一個動態庫調用flubber.dll
  2. 庫導出功能bool GetFlubber(Flubber* flubber)
  3. 函數和類型Flubber(它恰好是一個struct!)在名爲flubber.h的頭文件中聲明。

如果這3個條件都滿足,那麼你就可以在flubber.dll,其次是GetProcAddressGetFlubber爲PROC名稱中使用LoadLibrary,最後你可以通過本地聲明Flubber實例,並把它傳遞給GetFlubber檢索到的proc地址。

0

正如其他答案所表明的,很難說出這裏提出的問題,但我會針對該問題的另一種解釋提出迴應。我不確定它是否「正式支持」,但你可以有一個DLL導出一個全局變量,然後通過GetProcAddress動態訪問它。

例如,如果一個名爲foo.dll的庫包含一個名爲g_MyGlobal的FOO類型的全局變量,那麼它可以將該變量導出到foo.def中。客戶端代碼然後可以調用:

MyPointer = GetProcAddress(..., "g_MyGlobal"); 

並獲得一個指向全局的「FOO *」指針。

...但有了這個說法,如果你發現自己需要爲私人測試以外的其他目的做這件事,你可能需要重新考慮你的設計。將這個全局隱藏在DLL中的導出函數背後可能會更安全和更乾淨。