É seguro para passar ponteiros de função como argumentos para DLL funções e chamá-los de dentro da dll?

StackOverflow https://stackoverflow.com/questions/653697

Pergunta

Eu gostaria de passar alguns ponteiros de função (dll ou não) como argumentos para algumas funções DLL e chamá-los de dentro da DLL. Eu me pergunto se é seguro porque eu encontrei uma informação sobre http://publib.boulder.ibm.com/infocenter/zos/v1r10/index.jsp?topic=/com.ibm.zos.r10.cbcpx01/fpref htm que:

No código DLL, presume-se que um ponteiro de função aponta para um descritor de função. Uma chamada ponteiro função é feita por primeiramente se obter o endereço de função através dereferencing o ponteiro; e depois, de ramificação para a entrada da função. Quando um ponteiro de função não-DLL é transmitida ao código DLL, que aponta directamente para a entrada da função. Uma tentativa para eliminar referência através de um tal ponteiro produz um endereço de função indefinida. A ramificação posterior para o endereço indefinido pode resultar em uma exceção.

Será que esta regra se aplica a Visual Studio e outros compiladores também?

O que exatamente eu estou tentando fazer é resolver o problema de alocação de memória e desalocação entre várias funções DLL e não-dll. Minha idéia é passar dois ponteiros de função - para as funções de alocação e desalocação comuns -. A cada dll em algum inicialização (por exemplo Initialize (& malloc, e livre)) e, em seguida, fazer todo o gerenciamento de memória usando estes comum e, portanto, sempre funções compatíveis

Foi útil?

Solução

Não é verdade. código DLL trata funcionar ponteiros exatamente da mesma forma que código não-DLL. Se isso não fosse o caso, não se poderia utilizar as funções da biblioteca padrão como qsort () (que espera um argumento ponteiro de função) dentro de uma DLL.

Outras dicas

Passando ponteiros de função para uma DLL tem sido feito por gerações.

Todas as funções de retorno de chamada usadas na programação GUI (para atualização bares exemplo de progresso) ponteiros de função uso.

Ao desenvolver usando Win32, há uma razão que você deseja usar ponteiros de função para malloc / free? Por que você não simplesmente usando malloc / free diretamente?

É assim que eu sempre fiz isso no passado. Não que isso garante que é a maneira correta.
Na verdade, você pode tomar isso como uma indicação de que é a pior maneira possível:)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top