2016-03-04 40 views
0

我有一個寫入流的問題,作爲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

+0

請介紹的語法,C之間選擇和C++。有不同的語言 – Garf365

+0

@ Garf365:「編譯器:Visual ** C++ **」 – Olaf

+0

@Olaf但代碼呈現接縫C – Garf365

回答

0

請檢查fopen_s語法。您通過在指針前面使用&來傳遞FILE * *

嘗試取出&符號:
fopen_s(TestFile, /*...*/);

TestFile已經是一個指針:

FILE * TestFile; 

您的使用不匹配cppreference.com

+2

Microsoft需要傳遞FILE **變量的語法,請參閱here.。這是有意義的,因爲FILE *類型的變量必須被寫入。舊的fopen通過返回FILE *類型的值來實現它。我虛心懷疑在cppreference.com有一個錯字。 – Martin

+0

@Martin cppreference將指向指向FILE的指針的指針指向fopen_s的第一個參數 – Cubbi