我有一個用VC++ 6編寫的動態鏈接庫。我用VC++ 2005編寫了一些代碼,它調用了原生的VC++ 6庫。每當我將std :: string傳遞給本地庫時,結果總是垃圾。但是,如果我通過其他類型,如char *,int等,這不會發生。任何理想的是什麼造成這種情況?從VC++ 2005向VC++ 6傳遞std :: string DLL導致垃圾回收
以下代碼說明了這一點。
// VC++ 6碼
class __declspec(dllexport) VC6
{
public:
VC6();
void DoSomething(const std::string &s);
}
VC6()::VC6() {}
void VC6::DoSomething(const std::string &s)
{
std::cout << s; // Resulting output on screen is garbage
}
// VC++ 2005代碼
void VC2005::DoSomething()
{
VC6 *vc6 = new VC6();
std::string s("Test String");
vc6->DoSomething(s);
delete vc6;
}
即使是POD也不安全。位字段和聯合可能會成爲麻煩的候選對象,但即使是簡單結構的打包也可能會從編譯器變爲編譯器。你希望字節排序不會改變,但它可以合法。 – 2009-11-27 00:30:30
我需要從VC8調用VC6的原因是因爲我無法訪問使用VC6編寫的庫的源代碼,但我需要將其轉換爲託管代碼,以便C#可以調用庫。 問題是,VC6庫大量使用std :: vector和std :: string,並且沒有辦法將這些類型直接封裝到c#中。所以我需要的是VC6和C#之間的橋樑,這就是我選擇VC6的VC8封裝的原因。 您提到過有關COM對象。你可以給我一些關於如何使用COM對象來達到上述目的的例子嗎? – Lopper 2009-11-27 00:37:11
Stephen Nutt:不錯,但是對於POD類型,你通常可以在沒有太多麻煩的情況下使用包裝編譯指示等。對於非POD類型,從一開始就幾乎失敗了。 – jalf 2009-12-01 12:37:41