我有一個寫入流的問題,作爲FILE *傳遞給包含在DLL中的函數。編譯器:Visual C++,所有版本2005到2015.精確的錯誤有所不同;下面給出VS 2015版本。 Win32和x64目標的問題相同。寫入傳遞給DLL的流
試圖歸結問題,可以考慮這樣的功能:
#include <stdio.h>
void TestPrintf(FILE *TestFile)
{
fprintf(TestFile, "Hello World");
}
現在,另一個函數將被調用以下列方式將上述功能:
#include <stdio.h>
void TestPrintf(FILE *TestFile);
void AnyFunction(void)
{
FILE *TestFile;
fopen_s(&TestFile, "PrintTest.txt", "wt");
TestPrintf(TestFile);
}
第一個功能是一部分一個DLL。根據在 屬性/ C/C++ /代碼生成設置的DLL和包含主叫程序兩者的編譯過程中,我得到了以下錯誤消息:
來電編譯爲多線程調試(靜態):
DLL編譯爲多線程或者調試(靜態)或調試多線程的DLL:編譯爲多線程(靜態)
Debug assertion failed
File: minkernel\crts\ucrt\src\appcrt\heap\debug_heap.cpp
Line: 980
Expression: __acrt_first_block == header
DLL:
Debug assertion failed in the same file as before, but now
Line: 892
Expression: is_block_type_valid(header->block_use)
DLL編譯用於多線程的DLL:
Again another variant of the same. Now it is:
Line: 888
Expression: _CrtlsValidHeapPointer(block)
主叫編譯爲多線程調試DLL:
DLL編譯爲任一多線程(靜態)或多線程調試(靜態):
same messages as above
DLL編譯爲多線程的DLL:
Yet another variant of the same. Now it is:
HEAP[FilePrintTest.exe]: Invalid address specified to RtlValidateHeap(
01060000, 0107B7A0)
爲多線程調試DLL編譯的DLL:
This is error-free.
來電編譯版本(無論是多線程或者多線程DLL):
all four versions of the DLL go error-free.
VS版本之間的差異似乎是VS 2015年第一次寫入輸出作爲預期和崩潰之後,而VS 2005米的崩潰已經同時編寫輸出。
如果函數 TestPrintf不是一個DLL,但在靜態庫,不存在這樣的問題(當然,將有大約庫的碰撞鏈接的消息,但測試項目工作仍然)。不過,不幸的是,我確實需要DLL中的寫函數,並且我必須能夠從任何地方調用它。
以上所有情況也適用於調用者處於控制檯程序並且流爲 stdout的情況。
所以我的問題是:我身邊有沒有一個愚蠢的錯誤?如果沒有,是否有辦法解決這個問題?
我將不勝感激您的建議!
Martin
請介紹的語法,C之間選擇和C++。有不同的語言 – Garf365
@ Garf365:「編譯器:Visual ** C++ **」 – Olaf
@Olaf但代碼呈現接縫C – Garf365