我有一個複雜的問題需要解決,因爲我卡住了,根本沒有辦法解決這個問題。 這裏有一個代碼以堆爲基礎的數據調用一個函數作爲參數
struct MyStruct
{
int x;
float y;
char c;
};
void foo(MyStruct a_myStruct);
int _tmain(int argc, _TCHAR* argv[])
{
void *pMyStruct = malloc(sizeof(MyStruct));
int* pInt = (int*)pMyStruct;
*pInt = 10;
pInt++;
float *pFloat = (float*)pInt;
*pFloat = 2.545;
pFloat++;
char *pChar = (char*)pFloat;
*pChar = 'c';
_asm
{
pMyStruct
call foo
}
return 0;
}
void foo(MyStruct a_myStruct)
{
}
在這裏你可以看到foo
在堆棧上的對象上進行操作,並期待棧對象時foo
被調用映射。但不幸的是,編譯時不知道MyStruct
類型,所以我必須創建內存塊,然後在運行時數據在該塊中填充,然後在foo
被asm調用時如上所示傳遞。
現在我該如何將堆空指針轉換爲堆棧類型對象。不知何故,如果我得到foo
的參數a_myStruct
的地址,我可以用void*
指向那個位置,但是我不能取消引用void*
,以便它被轉換成MyStruct
類型的對象。
任何其他解決問題的方法?就像在C++中一樣,我們也可以在運行時確定類型。
我有一個問題,在運行時調用函數在C++中可能有簽名具有完全未在這些類型的編譯時間。但細節已知用戶定義類型提供給我的(正如我破譯來自類型庫或DIA SDK的某些類型的詳細信息)。但主要問題是現在我想在運行時調用這些函數。在編譯時,我只有函數地址和用戶定義類型的詳細信息,哪些對象或指針參與了該函數簽名的參數。現在,如果我想在運行時調用該函數,我需要在運行時首先通過在堆上創建臨時塊並用該數據填充該塊來填充該類型。我具有該類型的所有細節。
現在的問題是我不知道該函數將參數作爲該類型的指針,我有詳細信息可用或該參數恰好是該類型的堆棧對象。如果我有指向該類型的指針沒有問題,但是如果對象存在,則在運行時調用該函數時遇到很大問題。
你想在這裏做什麼?無論如何,此代碼絕對沒有意義。也許你應該向後退一步,並解釋你正試圖解決的真正問題。 – 2010-08-06 19:39:31
嘗試將結構轉換爲指向其用於成員變量的類型的指針意味着您不知道結構如何工作。我和詹姆斯在一起。這段代碼沒有任何意義。 – 2010-08-06 19:43:42
我懷疑OP試圖修改每種情況下被投射到的類型結構的成員。爲什麼仍然完全困惑我。 – 2010-08-06 19:46:44